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

mat*_*pie 12 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^@
...
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

更新2:感谢所有帮助过的人:这就是我最终做的事情:创建.gitattributes包含内容*.reg text diff的文件,然后我将文件转换为UTF-8,因为UTF-16与diffs一样奇怪.我没有使用任何外国字符,所以UTF-8适合我.

And*_*all 10

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

*.reg diff
Run Code Online (Sandbox Code Playgroud)

  • 我需要把它改成`*.reg diff`(没有减号).但现在看起来很奇怪.我更新了这个问题. (5认同)

Cir*_*ord 4

快速回答

正如其他人指出的那样,此问题是由编码混淆引起的。您有两个选择:

  • 通过相应地重新保存将文件编码更改为 UTF-8。

  • 创建一个.gitattributes文件,并包含以下内容:

    *.reg working-tree-encoding=UTF-16LE-BOM eol=CRLF

原因

默认情况下,从 Windows 注册表编辑器导出的注册表以特定的 UTF-16 编码保存。在底层,Git 仅支持 UTF-8 及其超集,因此当 Git 看到 UTF-16 编码文件时,它会看到许多意外的非字符字节并将其解释为二进制文件。

要求 Git 通过设置属性将文件视为文本*.reg diff不起作用,因为 Git 仍然认为错误的编码。这就是为什么你看到所有这些^@角色。

解决方案

其他人建议的一种解决方案是将 UTF-16 文件另存为 UTF-8,这完全有效!但它确实有一个很大的缺点:如果您有很多 .reg 文件,或者您想从注册表编辑器重新导出密钥,则每次都必须使用正确的编码重新保存它。

或者,您可以告诉 Git 您计划对属性使用哪种编码working-tree-encoding。指定此选项后,Git 会将文本文件在提交到存储库时将其转换为 UTF-8,然后在签出时将其转换回原始编码。这样,当文件出现在工作目录中时,它始终具有原始编码。如果您熟悉行尾标准化,其行为与此类似。

如果您选择这条路线,则需要注意一些陷阱:

  1. 该属性相对较新(2018 年 3 月),因此如果您支持广泛的 Git 实现或版本,它可能会导致问题。
  2. 如果您要处理的不仅仅是小型 UTF-16 文件,编码转换可能会减慢速度,或者根据编码的不同,可能无法使往返过程毫发无伤。

出于这些原因,文档建议仅当文件无法有效地存储为 UTF-8 时才使用此属性,但根据您的使用情况,这些陷阱可能与您无关。最后,在使用此属性时,还必须指定使用哪些行尾字符以避免歧义。这就是通过eol属性完成的。

综上所述,我建议您尝试.gitattributes在存储库的根目录中创建一个文件,并包含以下行:

*.reg working-tree-encoding=UTF-16LE-BOM eol=CRLF