Git对* .reg文件说“二进制文件a ...和b ...不同”

时间:2011-02-18 20:10:38

标签: windows git registry

有没有办法强制Git将.reg文件视为文本?我正在使用Git来跟踪我的Windows注册表调整,Windows使用.reg来查找这些文件。

更新1:我让它运行差异(谢谢,安德鲁)。但是,现在看起来如下所示。这是编码问题吗?

index 0080fe3..fc51807 100644
--- a/Install On Rebuild/4. Registry Tweaks.reg
+++ b/Install On Rebuild/4. Registry Tweaks.reg
@@ -1,49 +1,48 @@
-<FF><FE>W^@i^@n^@d^@o^@w^@s^@ ^@R^@e^@g^@i^@s^@t^@r^@y^@ ^@E^@d^@i^@t^@o^@r^@
-^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;^@;
-^@^M^@
...

有什么想法吗?

更新2:感谢所有帮助过的人:这是我最后所做的:创建内容为.gitattributes的文件*.reg text diff,然后我将文件转换为UTF-8因为UTF-16对于差异是很奇怪的。我没有使用任何外国字符,所以UTF-8适合我。

4 个答案:

答案 0 :(得分:8)

要告诉git显式区分文件类型,请将以下内容放在存储库根目录的.gitattributes文件中:

*.reg diff

答案 1 :(得分:4)

Git将您的注册表导出文件视为二进制文件,因为它们具有NUL。没有好方法来区分或合并通用二进制文件。更改一个字节可以更改文件其余部分的解释。

处理二进制文件有两种常用方法:

  1. 接受他们是二进制的。 Diffs不会有意义,所以不要求它们。不要合并它们,这意味着只允许在一个分支上进行更改。在这种情况下,通过将每个调整(或一组相关调整放在一个单独的文件中,因此在一个文件中发生差异的可能方式较少,可以使这更容易。

  2. 将更改存储为文本,然后转换/转换为这些二进制形式。

  3. 即使是这些“文本”文件,UTF-16编码也包含NUL。但是,似乎没有非ASCII位。你可以将它们转换为ASCII(或UTF-8,如果没有扩展字符,它将是ASCII)?

答案 2 :(得分:2)

通过在记事本中打开每个.reg文件并将其保存为编码UTF-8,将.reg文件从utf16转换为utf8。

答案 3 :(得分:2)

创建一个 utf16toascii.py

#!/usr/bin/env python3
import sys
data = open(sys.argv[-1]).read()
ascii = data.decode('utf-16').encode('ascii', 'replace')
sys.stdout.write(ascii)

然后在bash中执行:

$ echo "*.reg diff=utf16strings" >> .gitattributes
$ git config --global diff.utf16strings.textconv /path/to/utf16toascii.py

你最好区分注册表文件,以及Xcode .strings文件或任何其他utf-16文件。