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

nac*_*o4d 135 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
Run Code Online (Sandbox Code Playgroud)

他们不是文本文件吗?

我检查了.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
Run Code Online (Sandbox Code Playgroud)

Phi*_*ley 71

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

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

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

编辑:快速搜索SO找到了can-i-make-git-recognition-a-utf-16-file-as-text,它应该会给你一些线索.

  • 你几乎但并非完全没有错.Git确实检查了实际文件,并在那里看到了"有趣"的字符.然而它并没有"认为"UTF-16是二进制的.它*是*二进制,因为文本定义为基于ASCII(这是内置差异唯一可以提供可用结果的东西),而UTF-16则不是.是的,有一种方法可以告诉git使用特殊的diff来处理模式定义的文件(使用`.gitattributes`). (9认同)
  • @JanHudec:在您看来,所有文件都是二进制文件. (6认同)
  • 我们都是对的,但是从不同的角度来看.我们都说"Git检查内容以确定其类型." 我们都说要让git知道它应该被视为UTF16,用户需要通过`.gitattributes`等告诉git. (3认同)
  • 我应该补充一点,“有趣的字符”实际上意味着零字节。 (2认同)
  • @stolosvik,(和JanH)这是一个更微妙的中间立场,因为UTF-8既包含基本的0-127个ASCII字符,也包括所有其他Unicode字符,而对于nul字符以外的任何其他字符都不需要null(00h)字节。 (“ C”字符串终止符)。因此,Git的文本定义是,当utf-8编码时,内容(以及前1k字节)不应具有空字节。尝试http://stackoverflow.com/questions/2241348/what-is-unicode-utf-8-utf-16进行有趣的阅读。我的原始评论是指将UTF-16编码的数据视为字节对的情况,因此,ASCII码点的高字节为00。 (2认同)

nai*_*rch 36

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

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

src/Acme/DemoBundle/Resources/public/js/i18n/* diff
doc/Help/NothingToSay.yml                      diff
*.css                                          diff
Run Code Online (Sandbox Code Playgroud)

如果要检查文件上是否设置了属性,可以在git check-attr的帮助下完成

git check-attr --all -- src/my_file.txt
Run Code Online (Sandbox Code Playgroud)

关于Git属性的另一个很好的参考可以在这里找到.

  • 这很有帮助,但实际上是不正确的——正确的属性是“diff”,而不是“text”。`text` 属性并不告诉 git 使用文本进行 diff,而是控制如何处理行结尾(规范化为 LF)。有关更多详细信息,请参阅 .gitattributes 链接。 (4认同)
  • 此外,您可以设置应执行的差异类型.例如,如果它是一个xml文件,你可以使用`diff = xml`而不仅仅是`diff`. (4认同)

Hem*_*ant 19

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

使用以下内容在.git\info文件夹中创建名为"attributes"的文件解决了该问题

*.java diff
*.js diff
*.pl diff
*.txt diff
*.ts diff
*.html diff
Run Code Online (Sandbox Code Playgroud)

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

  • 添加 `* diff` 对我很有帮助:它显示了所有类型文件的差异。但您的解决方案更好,因为避免在大型二进制文件中显示不必要的差异。 (2认同)

Chr*_*phy 18

如果文本文件中有一条超长行,Git甚至会确定它是二进制的.我分解了一个长字符串,把它变成了几个源代码行,然后突然文件从'二进制'变成了我能看到的文本文件(在SmartGit中).

因此,如果不在编辑器中点击"Enter",请不要键入太多的右键 - 否则稍后Git会认为您已创建了二进制文件.


dea*_*dog 9

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

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

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

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

  • Unicode 不是一种编码。它是一个字符集,UTF-8 是其编码之一,即对 Unicode 代码点进行编码的方式 (3认同)

Rob*_*bba 8

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

  • 就我而言,我的文件是带有 BOM 的 UTF-16,使用 Notepad++ 将编码更改为常规 UTF-8 解决了问题,而且我还必须在“.gitattributes”文件中手动添加以下内容:“*.extension diff” (2认同)

小智 6

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

    echo "new text" > new.txt
    git add new.txt
    git commit -m "dummy"
Run Code Online (Sandbox Code Playgroud)

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

    echo -e "newer text\000" > new.txt
    git diff
Run Code Online (Sandbox Code Playgroud)

你会得到这个结果

diff --git a/new.txt b/new.txt
index fa49b07..410428c 100644
Binary files a/new.txt and b/new.txt differ
Run Code Online (Sandbox Code Playgroud)

试试这个

git diff -a
Run Code Online (Sandbox Code Playgroud)

你会得到以下

    diff --git a/new.txt b/new.txt
    index fa49b07..9664e3f 100644
    --- a/new.txt
    +++ b/new.txt
    @@ -1 +1 @@
    -new file
    +newer text^@
Run Code Online (Sandbox Code Playgroud)


Stu*_* mc 6

我们遇到过这种情况,每当我们尝试对其进行更改时,.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该文件现在已添加为常规文本文件

从现在开始,我在文件中所做的任何更改都被视为常规文本差异。您也可以压缩这些提交(1、2 和 3 是您所做的实际更改),但我更希望将来能够看到我做了什么。Squashing 1 & 2 将显示二进制变化。


pat*_*ffe 6

尝试使用file查看编码详细信息(参考):

cd directory/of/interest
file *
Run Code Online (Sandbox Code Playgroud)

它产生如下有用的输出:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • `file` 不是 git 命令。它是一个完全独立的工具,在 Windows 上与 git 一起打包。是否有文档显示这就是 git 用于二进制文件检测的方法? (8认同)

归档时间:

查看次数:

83823 次

最近记录:

6 年,5 月 前