我有一个包含许多 .cs 文件的文件夹。其中一些文件(出于某种原因)被跟踪为二进制文件,git diff
命令不能正常地处理它们。
我尝试将所有这些文件重新保存为 UTF-8 编码,但无济于事。我尝试更改目录、目录名称、文件名和文件扩展名,所有这些都没有帮助。
我还尝试修改 .gitattributes 文件,将 *.cs 文件视为非二进制文件,但对我没有帮助:
*.cs diff=csharp
我需要一种方法将所有这些文件设置为非二进制,而不更改它们的路径或名称。是否有这样的方法?
我有一个包含许多 .cs 文件的文件夹。其中一些文件(出于某种原因)被跟踪为二进制文件,git diff
命令不能正常地处理它们。
我尝试将所有这些文件重新保存为 UTF-8 编码,但无济于事。我尝试更改目录、目录名称、文件名和文件扩展名,所有这些都没有帮助。
我还尝试修改 .gitattributes 文件,将 *.cs 文件视为非二进制文件,但对我没有帮助:
*.cs diff=csharp
我需要一种方法将所有这些文件设置为非二进制,而不更改它们的路径或名称。是否有这样的方法?
你可以使用以下方法使 git 把它认为是文本:
*.cs diff
你需要确保它实际上是文本。如果强制Git认为你的文件是文本,而实际上它并不是文本,可能会在各种情况下导致极其恶劣的行为。
你可能还需要设置一些其他属性:
*.cs diff merge text
该文本对于EOL规范化很有用。如果Git在合并时仍然认为文件是二进制的,您可能需要进行合并。
然而,真正的问题是“为什么Git将我的文件标记为二进制?”答案是因为它在文件的前8000个字符中看到了一个NULL(0)字节。通常,这是因为该文件被保存为UTF-8以外的其他格式,比如UCS-2、UCS-4、UTF-16或UTF-32。当使用ASCII字符时,这些格式都会嵌入NUL字符。虽然您的问题称已经将文件重新保存为UTF-8,但您可能需要再次使用十六进制编辑器进行检查。我怀疑它们并不是UTF-8,这就是问题的核心。
text
,因为似乎有些字符无法被Git正确解释(状态编码??),所以强制Git进行行结尾处理可能会产生不良后果。 - CB Bailey.gitattributes
文件。您的.gitattributes
文件在哪里设置,导致问题的文件路径是什么?很可能在这两者之间还有另一个.gitattributes
文件导致了问题。 - John Szakmeister.git/info/
文件夹中使用了错误的名称。名称应该是信息文件夹中的.git/info/attributes
。但你仍然要确保该文件不是二进制文件。UTF-8文件不应该以这种方式被检测到。这里可能仍然存在其他根本问题(例如,一个糟糕的gitattributes规则导致.cs
文件被视为二进制文件)。 - John Szakmeister
echo '*.cs diff' >>.gitattributes
时,它变成了普通的diff。你的.gitattributes
文件中还有其他内容吗? - CB Bailey