在git中将文件设置为非二进制文件

18

我有一个包含许多 .cs 文件的文件夹。其中一些文件(出于某种原因)被跟踪为二进制文件,git diff 命令不能正常地处理它们。 我尝试将所有这些文件重新保存为 UTF-8 编码,但无济于事。我尝试更改目录、目录名称、文件名和文件扩展名,所有这些都没有帮助。

我还尝试修改 .gitattributes 文件,将 *.cs 文件视为非二进制文件,但对我没有帮助:

*.cs diff=csharp

我需要一种方法将所有这些文件设置为非二进制,而不更改它们的路径或名称。是否有这样的方法?


只需使用“*.cs diff”即可使普通的diff功能正常工作,即使Git认为这些文件是二进制文件。当您尝试进行差异比较时,您看到了什么? - CB Bailey
如果我按照你所写的做,我会得到二进制文件a/PATH/FILENAME.cs和b/PATH/FILENAME.cs不同的结果。 - Creative Magic
这意味着该属性未被识别。我创建了一些混淆的数据,得到了“二进制文件...不同”,当我执行echo '*.cs diff' >>.gitattributes时,它变成了普通的diff。你的.gitattributes文件中还有其他内容吗? - CB Bailey
我的.gitattributes文件的内容如下:"*.cs diff merge text",没有其他内容,该文件本身也是UTF-8编码。为了确保文件读取正确,我在文件中写入了一些无意义的内容,并尝试进行git diff操作,结果出现了错误。这至少说明它正在读取该文件。 - Creative Magic
3个回答

19

你可以使用以下方法使 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,这就是问题的核心。


使用SublimeText 2检查了我的文件,编码显示为UTF-8。无论是否使用你编写的git属性,我都会得到相同的响应: username$ git diff diff --git a/PATH/FileName.cs b/PATH/FileName.cs index 3936d6d..a6730f9 100644 Binary files a/PATH/FileName.cs and b/PATH/FileName.cs differ username$重命名文件可以解决问题... - Creative Magic
如果Git认为文件是二进制的,你可能不想使用text,因为似乎有些字符无法被Git正确解释(状态编码??),所以强制Git进行行结尾处理可能会产生不良后果。 - CB Bailey
@CharlesBailey 对,这就是为什么我说“但是,你需要确保它确实是文本。” 但是,如果你强制情况发生,它可能会导致糟糕的事情发生,所以我会更清楚地表达。 - John Szakmeister
1
@CreativeMagic,那么肯定发生了其他事情。请查看您的树形目录,寻找另一个设置您的文件不同的.gitattributes文件。您的.gitattributes文件在哪里设置,导致问题的文件路径是什么?很可能在这两者之间还有另一个.gitattributes文件导致了问题。 - John Szakmeister
啊,那么也许你在.git/info/文件夹中使用了错误的名称。名称应该是信息文件夹中的.git/info/attributes。但你仍然要确保该文件不是二进制文件。UTF-8文件不应该以这种方式被检测到。这里可能仍然存在其他根本问题(例如,一个糟糕的gitattributes规则导致.cs文件被视为二进制文件)。 - John Szakmeister

2
使用Notepad++修改编码,将编码修改为没有字节顺序标记(BOM)的编码。目前,git将这些开头的BOM字符 (\0xFF\0xFE) 视为二进制文件的开头。

Notepad++ 编码菜单


1
在Sourcetree 3.1.2版本中:
  • 工具 > 选项 > 比较
  • 将“大小限制(文本)”多加一个零
  • 将“大小限制(二进制)”多加一个零
  • 点击确定
  • 查看 > 刷新 (或者F5)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接