4

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

*            text=auto
*.cs         text diff=csharp

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

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

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

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

有什么想法可以解决这个问题吗?更改文件的编码就足够了吗?

4

2 回答 2

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 脚本。(因为 s 没有简单的Replace()方法byte[]

于 2012-12-04T14:24:25.313 回答
0

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

于 2012-12-04T14:33:36.600 回答