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

时间:2012-12-04 14:17:27

标签: c# git encoding gitattributes

我最近使用以下设置将.gitattributes文件添加到c#存储库:

*            text=auto
*.cs         text diff=csharp

我重新规范了存储库following these instructions from github,它似乎工作正常。

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

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

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

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

2 个答案:

答案 0 :(得分:3)

如果使用每个字符为两个字节的编码,则会发生这种情况 然后将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();
}

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

答案 1 :(得分:0)

要解决此问题,请转换文件的编码(UTF-8应该没问题)或禁用换行符自动转换(git config core.autocrlf false和.gitattributes)。