指定编码的情况下使用git checkout -p。

3

我正在处理存储库中的混合编码文件。

我的系统$LANG是en_US.UTF8,文件编码是iso-8859-1。当我运行git checkout -p HEAD file时,git使用UTF8来显示差异。

然后我会看到类似于以下内容:

-               "�" - EUR
-               "�" - GBP
-               "�" - JPY
+               "�" - EUR
+               "�" - GBP
+               "�" - JPY
Discard this hunk from index and worktree [y,n,q,a,d,/,j,J,g,e,?]?

问题在于,"�"不是文件的正确内容。当我运行iconv -f iso-8859-1 -t UTF8 file | less时,我可以看到

"¤" - EUR
"£" - GBP
"¥" - JPY

当我在运行git checkout -p时,接受或拒绝更改时,我希望能够看到确切变化的字符,而不是无信息的“�”字符。我该怎么做?


我猜“一切转换为 UTF-8”不是有用的答案……我可以感受到不完整转换所带来的痛苦,我们也长期以来一直存在这个问题。你能否在操作时暂时将终端设置为 iso-8859-1?这些命令可能会解决问题,它们仅暂时将编码设置为该命令行所需的编码,并使用gvim,它也应该适应该编码:LANG=en_US.iso-8859-1 GIT_EDITOR=gvim git checkout -p HEAD file?(注意:所有内容都在一行上,变量定义在git之前而不需要分号或输出-如果您不熟悉,请询问。) - joanis
那么,@Yurkee,下面的答案有帮助吗?你设法解决了这个问题吗? - joanis
有点不太行,用gvim没能完全解决问题,很难说为什么,但它引导我找到了一个暂时可行的解决方案,但在更大的情况下可能行不通。 - Yurkee
1个回答

1
如果您使用的GUI编辑器关注LANG,则可以通过在其命令行上临时设置LANG来调用不同于终端编码的编码。例如,在utf-8终端中,我使用以下语法在gvim中编辑iso-8859-1文件:
LANG=en_US.iso-8859-1 gvim file-encoded-in-latin1

您应该可以通过暂时更改Git编辑器来实现git checkout -p的相同临时设置:
LANG=en_US.iso-8859-1 GIT_EDITOR=gvim git checkout -p HEAD file

如果您无法使用GUI编辑器,我不确定您该如何做到这一点,因为Git始终会显示文件的实际内容,并且终端控制显示编码。这就是为什么我认为您需要弹出一个像这样的GUI编辑器。

尽管使用gvim没有成功,但您的解决方案将我引导到了正确的位置,您是正确的,这可以通过图形文本界面来解决。对于这个问题,我决定在checkout -p的同时运行iconv,并且它给出了可接受的结果,但是需要花费时间。 - Yurkee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接