如何阻止git在结帐时破坏编码

我最近使用以下设置将.gitattributes文件添加到ac#repository:

* text=auto *.cs text diff=csharp 

我按照github的这些说明重新规范了存储库,它似乎工作正常。

我遇到的问题是当我签出一些文件(不是所有文件)时,我看到许多奇怪的字符与实际代码混在一起。 当git通过上面的.gitattributes文件指定的lf->crlf转换运行文件时,似乎会发生这种情况。

根据Notepad ++,混乱的文件使用UCS-2 Little EndianUCS-2 Big Endian编码。 似乎正常工作的文件是ANSIUTF-8编码。

作为参考,我的git版本是1.8.0.msysgit.0 ,我的操作系统是Windows 8。

我有什么想法可以解决这个问题? 更改文件的编码是否足够?

如果您使用每个字符都是两个字节的编码,就会发生这种情况。
然后将CRLF编码为\0\r\0\n

Git认为它是单字节编码,因此将其转换为\0\r\0\r\n
这使得下一行关闭一个字节,导致每隔一行充满中文。 (因为\0变为低位字节而不是高位字节)

您可以使用此LINQPad脚本将文件转换为UTF8:

 const string path = @"C:\..."; foreach (var file in Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories)) { if (!new [] { ".html", ".js"}.Contains(Path.GetExtension(file))) continue; File.WriteAllText(file, String.Join("\r\n", File.ReadAllLines(file)), new UTF8Encoding(encoderShouldEmitUTF8Identifier: true)); file.Dump(); } 

这不会修复损坏的文件; 您可以通过在hex编辑器中将\r\n \n替换为\r\n来修复文件。 我没有LINQPad脚本。 (因为byte[] s没有简单的Replace()方法)

要解决这个问题,要么转换文件的编码(UTF-8应该没问题),要么禁用换行自动转换( git config core.autocrlf false和.gitattributes你有的东西)。