为什么Git把这个​​文本文件当作一个二进制文件?

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

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

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

如果你有国际化(i18n)或文件的扩展字符格式,有办法告诉git。 我没有足够的确切的方法来设置 – 你可能需要RT [Full] M 😉

编辑:快速searchfind可以让我git认识一个utf-16文件作为文本应该给你一些线索。

如果你还没有设置文件的types,Git会自动判断它,并且一个真正很长的文件,也许一些宽字符 (比如Unicode)的文件被视为二进制文件。 使用.gitattributes文件,您可以定义Git如何解释文件。 手动设置diff属性可以让Git将文件内容解释为文本,并执行通常的diff。

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

 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属性的另一个很好的参考可以在这里find。

如果你的文本文件中有一行超长的行,Git甚至会确定它是二进制的。 我分手了一个长长的string,把它变成了几个源代码行,突然之间文件从“二进制”变成了一个我可以看到的文本文件(在SmartGit中)。

所以如果不在编辑器中input“Enter”,不要打字太远,否则后来Git会认为你已经创build了一个二进制文件。

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

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

 *.java diff *.js diff *.pl diff *.txt diff 

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

我在一个新的编辑器中编辑了一个文件后,也遇到了同样的问题。 原来,新编辑器使用了不同于我的旧编辑器(UTF-8)的编码(Unicode)。 所以我只是告诉我的新编辑用UTF-8保存我的文件,然后git再次正确显示我的更改,并没有看到它作为一个二进制文件。

我认为这个问题很简单,git不知道如何比较不同编码types的文件。 所以你使用的编码types并不重要,只要它保持一致。

我没有testing,但我确定如果我刚刚提交了新的Unicode编码的文件,下一次我对该文件进行了更改,它将显示正确的更改,并且没有将其检测为二进制,因为那么它将会比较两个Unicode编码的文件,而不是一个UTF-8文件到一个Unicode文件。

您可以使用Notepad ++等应用程序轻松查看和更改文本文件的编码types; 在Notepad ++中打开文件并使用工具栏中的编码菜单。

我有同样的问题。 我在Google上search解决scheme时发现了这个线程,但是我还是没有发现任何线索。 但是我想我在学习之后find了原因,下面的例子会解释清楚我的线索。

  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^@ 

我们有这种情况,一个.html文件被视为二进制文件,只要我们试图对其进行更改。 非常不酷,看不到差异。 说实话,我并没有在这里检查所有的解决scheme,但是对我们来说有效的是:

  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是你所做的实际改变),但是我更愿意将来能够看到我做了什么。 压缩1和2将显示二元变化。

面对.java文件中的类似问题。 就我而言,这个问题是由于存在特殊字符。

请检查文件中是否存在特殊字符。

我只花了好几个小时的时间仔细研究这个列表中的所有内容,试图解决为什么我的解决scheme中的一个testing项目没有向探测器添加任何testing。

原来在我的情况下(可能是因为糟糕的git合并)VS已经完全失去了项目的参考。 它还在build设中,但我注意到它只build立了依赖关系。

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