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

时间:2011-07-28 07:55:48

标签: git binary

我想知道为什么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

15 个答案:

答案 0 :(得分:68)

它只是意味着当git检查文件的实际内容时(它不会知道任何给定的扩展名不是二进制文件 - 如果你想告诉它你可以使用属性文件它明确 - 参见手册页。)

检查了文件的内容后,它看到的内容不是基本的ascii字符。作为UTF16,我希望它会有“有趣”的字符,所以它认为它是二进制的。

如果你有文件的国际化(i18n)或扩展字符格式,有办法告诉git。我没有充分了解设置的确切方法 - 你可能需要RT [Full] M ;-)

编辑:快速搜索SO can-i-make-git-recognize-a-utf-16-file-as-text,这应该会给你一些线索。

答案 1 :(得分:33)

如果你还没有设置文件的类型,Git会尝试自动确定它,并且一个行很长且可能有一些wide characters(例如Unicode)的文件被视为二进制文件。使用.gitattributes文件,您可以定义Git如何解释文件。手动设置 diff 属性可让Git将文件内容解释为文本并执行通常的差异。

只需将 .gitattributes 添加到您的存储库根文件夹,并将 diff 属性设置为路径或文件。这是一个例子:

src/Acme/DemoBundle/Resources/public/js/i18n/* diff
doc/Help/NothingToSay.yml                      diff
*.css                                          diff

如果要检查文件中是否设置了属性,可以在git check-attr

的帮助下执行此操作
git check-attr --all -- src/my_file.txt

可以找到关于Git属性的另一个很好的参考here

答案 2 :(得分:18)

如果你的文本文件中有一条超长行,Git甚至会确定它是二进制的。我打破了一个很长的字符串,把它变成了几个源代码行,突然之间,这个文件来自于二进制文件'到我能看到的文本文件(在SmartGit中)。

所以不要在没有按下“输入”字样的情况下输入太远的权利。在你的编辑器中 - 否则稍后Git会认为你已经创建了一个二进制文件。

答案 3 :(得分:18)

我遇到了这个问题,Git GUI和SourceTree将Java / JS文件视为二进制文件,因此无法看到差异

创建名为"属性的文件"在.git \ info文件夹中,以下内容解决了问题

*.java diff
*.js diff
*.pl diff
*.txt diff
*.ts diff
*.html diff

如果您想对所有存储库进行此更改,则可以在以下位置添加属性文件 $ HOME /的.config / GIT中/属性

答案 4 :(得分:9)

在新编辑器中编辑我的一个文件后,我遇到了同样的问题。事实证明,新编辑器使用了与我的旧编辑器(UTF-8)不同的编码(Unicode)。所以我只是告诉我的新编辑器用UTF-8保存我的文件,然后git再次正确显示我的更改并且没有将其视为二进制文件。

我认为问题只是git不知道如何比较不同编码类型的文件。所以你使用的编码类型确实无关紧要,只要它保持一致。

我没有测试它,但我确定我是否会使用新的Unicode编码提交我的文件,下次我对该文件进行更改时,它会正确显示更改并且不会将其检测为二进制文件,从那时起它就会将两个Unicode编码文件而不是UTF-8文件与Unicode文件进行比较。

您可以使用Notepad++之类的应用轻松查看和更改文本文件的编码类型;在Notepad ++中打开文件,然后使用工具栏中的“编码”菜单。

答案 5 :(得分:6)

我遇到了同样的问题。当我在谷歌搜索解决方案时,我找到了线程,但我仍然没有发现任何线索。但是我觉得我在学习之后找到了原因,下面的例子将清楚地解释我的线索。

    echo "new text" > new.txt
    git add new.txt
    git commit -m "dummy"

目前,文件new.txt被视为文本文件。

    echo -e "newer text\000" > new.txt
    git diff

你会得到这个结果

diff --git a/new.txt b/new.txt
index fa49b07..410428c 100644
Binary files a/new.txt and b/new.txt differ

并试试这个

git diff -a

你会得到

    diff --git a/new.txt b/new.txt
    index fa49b07..9664e3f 100644
    --- a/new.txt
    +++ b/new.txt
    @@ -1 +1 @@
    -new file
    +newer text^@

答案 6 :(得分:3)

我们遇到过这种情况,每当我们尝试对其进行更改时,.html文件就被视为二进制文件。非常不酷,看不到差异。说实话,我没有在这里检查所有解决方案,但对我们有用的是:

  1. 删除了文件(实际上将其移动到我的桌面)并提交 git deletion。 Git说Deleted file with mode 100644 (Regular) Binary file differs
  2. 重新添加文件(实际移动了 它从我的桌面回到项目中)。 Git说New file with mode 100644 (Regular) 1 chunk, 135 insertions, 0 deletions文件 现在已添加为常规文本文件
  3. 从现在开始,我在文件中所做的任何更改都被视为常规文本差异。你也可以压缩这些提交(1,2和3是你所做的实际改变),但我更愿意在将来看到我做了什么。压扁1& 2将显示二进制更改。

答案 7 :(得分:3)

根据this helpful answer,您可以直接询问Git为什么以特定方式处理文件:

cd directory/of/interest
file *

它产生如下有用的输出:

$ file *
CR6Series_stats resaved.dat: ASCII text, with very long lines, with CRLF line terminators
CR6Series_stats utf8.dat:    UTF-8 Unicode (with BOM) text, with very long lines, with CRLF line terminators
CR6Series_stats.dat:         ASCII text, with very long lines, with CRLF line terminators
readme.md:                   ASCII text, with CRLF line terminators

答案 8 :(得分:1)

我有一个实例,其中.gitignore按目的包含了一个双\r(回车)序列。

该文件被git识别为二进制文件。添加.gitattributes文件有帮助。

# .gitattributes file
.gitignore diff

答案 9 :(得分:0)

如果git check-attr --all -- src/my_file.txt指示您的文件被标记为二进制文件,而您尚未在.gitattributes中将其设置为二进制文件,请在/.git/info/attributes中进行检查。

答案 10 :(得分:0)

将Aux.js更改为另一个名称,例如Sig.js。

源树仍将其显示为二进制文件,但是您可以暂存(添加)并提交。

答案 11 :(得分:0)

这也是(至少在Windows上)由具有 UTF-8和BOM 编码的文本文件引起的。立即将编码更改为常规 UTF-8 可使Git将文件视为type = text

答案 12 :(得分:0)

我遇到了类似的问题,因为我从二进制Kafka消息中粘贴了一些文本,该消息插入了不可见的字符,并导致git认为文件是二进制的。

我通过使用正则表达式[^ -~\n\r\t]+搜索文件发现了令人反感的字符。

  • [匹配此集合中的字符
  • ^匹配不在此集合中的字符
  • -~匹配从''(空格)到'〜'的所有字符
  • \n换行符
  • \r回车
  • \t标签
  • ]关闭集
  • +匹配这些字符中的一个或多个

答案 13 :(得分:0)

我的文件显示为二进制文件的原因(dI 使用 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

答案 14 :(得分:-2)

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

事实证明,在我的情况下,某种程度上(可能是因为某个地方的git合并很差)VS完全失去了对该项目的引用。它仍然在建设,但我注意到它只建立了依赖性。

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