2013-11-01 96 views
4

我有一个包含大量.cs文件的文件夹。其中一些文件(出于某种原因)被跟踪为二进制文件,git diff命令无法正常工作。 我尝试将所有这些文件重新保存为UTF-8编码,但它没有帮助。我试着改变目录,目录名称,文件名和文件扩展名,所有这些都有所帮助。在git中将文件设置为非二进制文件

我也尝试修改.gitattributes文件处理*的.cs文件作为非二进制的,但它并没有帮助我:

*.cs diff=csharp 

我需要一种方法来设置所有这些文件作为非二进制不改变他们的路径或名字。有没有这样的方式?

+0

即使Git认为这些文件是二进制文件,只要'* .cs diff'应该启用正常的比较。当你尝试差异时,你看到了什么? –

+0

如果我喜欢你写的,我得到二进制文件a/PATH/FILENAME.cs和b/PATH/FILENAME.cs不同 –

+0

这意味着该属性尚未被识别。我创建了一些混乱的数据,并得到了“二进制文件...不同”,当我做'echo'* .cs diff'>>。gitattributes'时,它变成了正常的差异。你的'.gitattributes'文件中还有其他东西吗? –

回答

11

你可以做到这一点,迫使混帐认为它是文本:

*.cs diff 

你要确保它实际上是文本,但。强制Git认为你的文件是文本的时候,实际上并不会在各种情况下导致非常不好的行为。

您可根据需要设置其他几个属性太:

*.cs diff merge text 

的文本是EOL正常化有用。如果Git在合并时仍认为文件是二进制的,你可能需要合并。

但是,真正的问题是“为什么Git将我的文件标记为二进制文件?”答案是因为它在文件的前8000个字符内的某个地方看到一个NUL(0)字节。通常情况下,这是因为文件被保存为UTF-8之外的其他文件。所以,它可能被保存为UCS-2,UCS-4,UTF-16或UTF-32。所有这些在使用ASCII字符时都嵌入了NUL字符。因此,虽然您的问题表示您已将文件重新保存为UTF-8,但您可能需要再次使用十六进制编辑器进行检查。我怀疑它们不是UTF-8,这是问题的核心。

+0

使用SublimeText 2检查了我的文件,编码显示为UTF-8,带有(或w/o)你写的git属性我得到相同的回应: username $ git diff diff --git a/PATH/FileName.cs b/PATH/FileName.cs index 3936d6d..a6730f9 100644 二进制文件a /PATH/FileName.cs和b/PATH/FileName.cs不同 用户名$ 并重命名该文件有帮助... –

+0

如果Git *认为*该文件是二进制文件,则可能不想使用“文本” ,尽管看起来有些字符没有被Git(有状态编码)正确解释,所以强制Git做直线结束变形可能会产生不希望的可靠的结果。 –

+0

@CharlesBailey对,这就是为什么我说“你要确保它确实是文本。”但是,如果你强迫这种情况发生,我会更清楚地说明它会导致坏事发生。 – jszakmeister

相关问题