Git弄乱了我的文件,在某些地方显示了汉字

lag*_*lex 22 git unicode gitattributes

免责声明:Git,我的意思是'我'搞砸了.

此前,我想git-gui给我看diff的这它认为是二进制文件.

所以我对我做了一些改动 .\.gitattributes

*.ini       text
*.inc       text
Run Code Online (Sandbox Code Playgroud)

但它没有用. 然后,我做了一些改变,以我的.\.git\info\attributes

*.ini       text
*.inc       text
*.inc crlf diff
*.ini crlf diff
Run Code Online (Sandbox Code Playgroud)

它起作用了.

但现在当我回到之前的承诺时,它会搞砸......

中国文字应该是这样的: 英文字符

它不会发生在所有文件中.编辑:它只发生在其中包含任何特殊字符的文件中.

问:这是提交本身的问题还是只是一些设置?
问:我能恢复吗?

bob*_*nce 26

您的ini文件以UTF-16LE保存,Windows编码错误地将其描述为"Unicode".

Git的默认差异工具不适用于UTF-16,因为它不是与ASCII兼容的编码.这就是git最初将文件检测为二进制文件的原因.

LF/CRLF换行转换将每个0x0A字节视为换行符,并将其替换为0x0D-0x0A.但是,在UTF-16LE文件中,换行实际上是由0x0A-0x00发出信号,并用0x0D-0x0A-0x00替换它意味着你有一个奇数个字节,所以每个双字节代码单元的对齐在下一行不同步.因此,每一条线都会受到损坏.

你的选择是:

  1. 恢复属性更改并让Git将文件作为二进制文件处理(失去差异的好处).

  2. 以ASCII兼容的编码保存文件.看起来你的内容实际上没有任何非ASCII字符,所以希望这不是问题吗?通常,您希望将所有文件保存为UTF-8 - 这与ASCII兼容,但也允许使用所有Unicode字符.但这取决于Rainmeter是否支持读取那样编码的INI文件(可能不是).

  3. 配置git以使用不同的diff工具,但这会使其他人使用你的repo变得更加复杂.


Rob*_*Rob 7

我最近遇到了类似的问题.我们.gitattributes在根级别有一个项目范围的文件,其中包括以下行: -

* text=auto
*.sql     text
Run Code Online (Sandbox Code Playgroud)

我们的团队之一是使用SQL Management Studio编写SQL代码,他不知道将文件保存为UTF-16.他能够毫无问题地将代码签入Git,但在签出时,代码被翻译成中文字符,如本文所述.

有问题的文件的hexdump确认问题确实是0x000A到0x000A0D的转换.

对我们来说,解决方案是使用以下方法将文件转换为ASCII: -

  1. 从工作目录中删除违规文件
  2. .gitattributes在本地目录中创建一个临时文件,强制git签出文件而不执行行结束转换.例如包括线*.sql binary

  3. 从Git中签出文件.您应该看到文件尚未翻译且没有中文字符.

  4. 将文件转换为ASCII.我们使用了Notepad ++,但它也可以使用iconv,它是作为Git For Windows的一部分安装的.我认为如果文件包含非ASCII字符,UTF-8也是一个选项 - 但这对我们的目的来说不是必需的.
  5. 签入文件的ASCII版本
  6. 删除本地.gitattributes文件