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



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

*            text=auto
*.cs         text diff=csharp

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

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

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

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

任何想法如何解决这个问题?更改文件的编码就足够了吗?

如果使用每个字符都是两个字节的编码,则会发生这种情况。
然后,CRLF 将被编码为 rn

Git 认为它是一种单字节编码,所以它把它变成了 rrn .
这使得下一行少一个字节,导致每隔一行都充满中文。 (因为变成了低位字节而不是高位字节)

您可以使用以下 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("rn", File.ReadAllLines(file)), new UTF8Encoding(encoderShouldEmitUTF8Identifier: true));
    file.Dump();
}

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

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

相关内容

  • 没有找到相关文章

最新更新