C# 如何阻止git在签出时破坏编码

C# 如何阻止git在签出时破坏编码,c#,git,encoding,gitattributes,C#,Git,Encoding,Gitattributes,我最近使用以下设置向c#存储库添加了一个.gittributes文件: * text=auto *.cs text diff=csharp 我重新规范化了存储库,它似乎工作正常 我遇到的问题是,当我签出一些文件(不是全部)时,我看到许多奇怪的字符与实际代码混合在一起。当git通过上面的.gittributes文件指定的lf->crlf转换运行文件时,似乎会发生这种情况 根据Notepad++的说法,被弄乱的文件使用的是UCS-2Little-Endian或

我最近使用以下设置向c#存储库添加了一个.gittributes文件:

*            text=auto
*.cs         text diff=csharp
我重新规范化了存储库,它似乎工作正常

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

根据Notepad++的说法,被弄乱的文件使用的是
UCS-2Little-Endian
UCS-2Big-Endian
编码。工作正常的文件是
ANSI
UTF-8
编码的

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


有没有办法解决这个问题?更改文件的编码是否足够?

如果使用每个字符都是两个字节的编码,则会发生这种情况。
然后,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()
byte[]s)方法来解决这个问题,

要么转换文件的编码(UTF-8应该可以),要么禁用换行自动转换(
git config core.autocrlf false
和.gittributes你有的东西)。

我使用了你的建议,但是从这里运行了powershell脚本:它似乎已经解决了问题。