为什么Git将这个文本文件视为二进制文件?

209

我想知道为什么 Git 告诉我这个?

$ git diff MyFile.txt
diff --git a/MyFile.txt b/MyFile.txt
index d41a4f3..15dcfa2 100644
Binary files a/MyFile.txt and b/MyFile.txt differ

它们不是文本文件吗?

我已经检查了.gitattributes文件,但它是空的。为什么我会收到这个消息?我不能像以前那样获取差异了。

添加:

我注意到文件权限中有一个@,这是什么意思?这可能是原因吗?

$ls -all
drwxr-xr-x   5 nacho4d  staff    170 28 Jul 17:07 .
drwxr-xr-x  16 nacho4d  staff    544 28 Jul 16:39 ..
-rw-r--r--@  1 nacho4d  staff   6148 28 Jul 16:15 .DS_Store
-rw-r--r--@  1 nacho4d  staff    746 28 Jul 17:07 MyFile.txt
-rw-r--r--   1 nacho4d  staff  22538  5 Apr 16:18 OtherFile.txt

5
可能是一个UTF-8编码的文件。 - Marnix van Valen
1
它应该是UTF16小端LF。 - nacho4d
2
在Mac OS X上的ls手册中:如果文件或目录具有扩展属性,则由-l选项打印的权限字段后面跟随一个@字符。使用-@选项查看这些扩展属性。 - adl
6
很奇怪,因为Git根本不应该知道有任何扩展属性。如果你能够重现这个问题,最好在Git邮件列表上提出来。按照vger.kernel.org列表的惯例,您不必订阅即可发布(人们会将答案CC给您),而且还应该避免订阅git@vger.kernel.org列表,因为邮件量相当大。 - Jan Hudec
可能是重复的问题:为什么Git认为我的.cs文件是二进制的? - Nick Grealy
显示剩余4条评论
17个回答

2
如果git check-attr --all -- src/my_file.txt表明你的文件被标记为二进制文件,并且你没有在.gitattributes中将其设置为二进制文件,请在/.git/info/attributes中检查它。

1
将Aux.js更改为另一个名称,比如Sig.js。
源代码树仍然显示它是一个二进制文件,但你可以将其暂存(添加)并提交。

1
我曾遇到类似的问题,因为从二进制Kafka消息中粘贴文本时插入了不可见字符,导致git认为该文件是二进制文件。我通过使用正则表达式[^ -~\n\r\t]+在文件中搜索有问题的字符找到了它们。
  • [匹配此集合中的字符
  • ^匹配不在此集合中的字符
  • -~匹配从空格到波浪号之间的所有字符
  • \n换行符
  • \r回车符
  • \t制表符
  • ]关闭集合
  • +匹配一个或多个这些字符

1

当我使用echo命令在Powershell终端生成文件并进行差异比较时,我收到了相同的消息:

echo "new file" > newfile.txt

即使我使用编辑器打开并编辑了这些文件,它们仍然保持着二进制格式。

对我来说,一个快速而不太优雅的解决方案是复制这些文件的内容,删除它们,直接从编辑器(而不是终端)创建它们,然后粘贴回内容。之后进行差异比较会显示正确的每行冲突,就像我们所期望的那样。


0

我刚刚花了几个小时查看这个列表中的所有内容,试图弄清楚为什么我的解决方案中的一个测试项目没有向资源管理器添加任何测试。

事实证明,在我的情况下,由于某些原因(可能是由于糟糕的 git 合并),VS 已经完全失去了对该项目的引用。它仍在构建,但我注意到它只构建了依赖项。

然后我注意到它并没有出现在依赖项列表中,所以我删除并重新添加了测试项目,最终显示了所有的测试。


2
Visual Studio 在这里并不相关。 - jpaugh

0
我的文件显示为二进制(并且我在使用git diff或SourceTree时没有获得任何差异)的原因是,涉及的文件是作为Git LFS文件添加的。
Git(和SourceTree)似乎无法区分添加到LFS的文本文件。但是在经过一番搜索后,我能够通过运行... git config --global diff.lfs.textconv cat 在这里得到了建议的帮助: https://github.com/git-lfs/git-lfs/issues/440#issuecomment-501007460

0
在Windows上,当我使用Powershell创建文本文件时,遇到了这个问题。使用echo和重定向运算符>来写入/追加文本数据会产生带有Unicode编码的文件
PS> echo 'sample' > data.txt
PS> Get-Encoding data.txt

Encoding                    Path
--------                    ----
System.Text.UnicodeEncoding data.txt

PS> git diff --staged

diff --git a/data.txt b/data.txt
...
Binary files /dev/null and b/data.txt differ

一种解决方案是将编码转换为ASCII:(您还可以使用Convert-FileEncoding一次更改多个文件的编码)
PS> Set-Content data.txt $(Get-Content data.txt) -Encoding ascii

这样,git就不再将您的文本文件视为二进制文件:

PS> git add -A; git diff --staged


diff --git a/data.txt b/data.txt
...
--- /dev/null
+++ b/data.txt
@@ -0,0 +1 @@
+sample

为了避免这个问题的发生,我们应该使用PowerShell的Set-ContentAdd-Content命令来创建/追加文本文件。
PS> Set-Content data2.txt 'sample2'
PS> git add -A; git diff --staged data2.txt


diff --git a/data2.txt b/data2.txt
...
--- /dev/null
+++ b/data2.txt
@@ -0,0 +1 @@
+sample2

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