我最近使用以下设置将.gitattributes文件添加到c#存储库:
* text=auto
*.cs text diff=csharp
我重新规范了存储库following these instructions from github,它似乎工作正常。
我遇到的问题是当我签出一些文件(不是所有文件)时,我看到许多奇怪的字符与实际代码混在一起。当git通过上面的.gitattributes文件指定的lf->crlf
转换运行文件时,似乎会发生这种情况。
根据Notepad ++,混乱的文件使用UCS-2 Little Endian
或UCS-2 Big Endian
编码。似乎正常工作的文件可以是ANSI
或UTF-8
编码。
作为参考,我的git版本是1.8.0.msysgit.0
,我的操作系统是Windows 8。
我有什么想法可以解决这个问题?更改文件的编码是否足够?
答案 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)。