首页 > 解决方案 > 为 git 存储库中的每个文件配置编码以正确输出“git diff”

问题描述

假设我的 git 存储库中有两个具有不同编码的文件:UTF-8 和 CP866。我有控制台等配置了 UTF-8 设置。

我想要 git 命令的输出,例如git diffgit show正常运行,并且不显示类似的内容:

diff --git a/myfile.tex b/myfile.tex
index 01ad4f3..b1fd24c 100644

--- a/myfile.tex
+++ b/myfile.tex
@@ -220,9 +220,9 @@ centertags]%
-<A3><A4><A5> $f_i \in k[x_1, \ldots , x_n]$, <A8><AC><A5><A5><E2> <E0><A5>襭&lt;A8><A5> $(a_1, \dots, a_n)$. <92><AE><A3><A4><A0> <AF><AE><AB><A8><AD><AE><AC><A8><A0><AB>쭠&lt;EF> <E1><A8><E1>⥬&lt;A0> $\{ R(f_1,f_i) = 0 \}$ <A4><AB><EF> $i = 2, \dots, n$, <A3><A4><A5> $f_i$ <E0><A0><E1>ᬠ&lt;E2>ਢ&lt;A0><A5><E2><E1><EF> <AA><A0><AA> <AF><AE><AB><A8><AD><AE><AC> <AE><E2> $x_n$ <AD><A0><A4> <AA><AE><AB><EC>殬 $k[x_1, \ldots , x_{n-1}]$, 
<E1><AE><E1>⮨&lt;E2> <A8><A7> $n-1$ <E3>ࠢ&lt;AD><A5><AD><A8><A9> <AE><E2> <AF><A5>६&lt;A5><AD><AD><EB><E5> $x_1, \dots x_{n-1}$, <A8> <A8><AC><A5><A5><E2> <E0><A5>襭&lt;A8><A5> $(a_1, \dots, a_{n-1})$.
+<A

有一个选项可以为所有文件设置编码转换:

git config --local core.pager "iconv -f cp866 -t utf-8 | less"
git config --local i18n.commitEncoding utf8
git config --local i18n.logoutputencoding cp866

但我的目标是以某种方式设置每个文件的编码转换。我希望我的 UTF-8 文件和 CP866 文件能够正确处理。

有解决办法吗?

标签: gitencodingconfigurationcharacter-encodingfile-encodings

解决方案


如果你有一个相当新的 Git,你可以让 Git 将存储库中的所有文件都以 UTF-8 格式存储,并以不同的编码简单地检查其中一些文件。然后 Git 将按预期显示差异,但您的工作树将具有正确编码的文件。

您可以通过.gitattributes在存储库的根目录中创建一个如下所示的文件来执行此操作:

myfile.tex working-tree-encoding=CP866

(您可能更喜欢使用IBM866,因为这是标准名称,它可能得到更广泛的支持。)如果您希望文件在您的系统上仅使用 CP866 并让其他人使用 UTF-8 版本,那么您可以输入此条目in.git/info/attributes而不是将其签入回购。

您还可以在 gitattributes 文件中指定(几乎)任何可以在 gitignore 文件中指定的模式,例如,您可以使用通配符。

添加.gitattributes文件后,您应该运行git add --renormalize .以确保所有文件都使用正确的编码,然后提交所有更改。

新存储库的一组示例步骤:

git init
printf 'a\xffb\n' >myfile.tex
git add myfile.tex
git commit -m 'Add CP866 file'
# You are here.
echo 'myfile.tex working-tree-encoding=CP866' >.gitattributes
git add --renormalize .
git commit -m 'Store files as UTF-8'

推荐阅读