为什么 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
131091 次浏览

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

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

有一些方法可以告诉 git 文件是否具有国际化(i18n)或扩展字符格式。我没有充分掌握确切的设置方法-您可能需要 RT [ Full ] M; -)

编辑: 快速搜索所以发现 Can-i-make-git-識-a-utf-16-file-as-text应该给你一些线索。

如果在文本文件中有一个超长的行,Git 甚至会判断它是二进制的。我分解了一个长长的 String,把它转换成几行源代码,突然文件从“二进制”变成了我可以看到的文本文件(在 SmartGit 中)。

因此,不要一直向右键入太多,否则在编辑器中点击“回车”-否则以后 Git 会认为你已经创建了一个二进制文件。

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

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

我没有测试它,但是我确信如果我只是用新的 Unicode 编码提交我的文件,下次我对那个文件进行更改时,它会正确地显示更改,而不会检测到二进制文件,因为那样它就会比较两个 Unicode 编码的文件,而不是一个 UTF-8文件和一个 Unicode 文件。

您可以使用像 记事本 + + 这样的应用程序轻松地查看和更改文本文件的编码类型; 在 Notepad + + 中打开该文件并使用工具栏中的“编码”菜单。

如果您还没有设置文件的类型,Git 将尝试自动确定它,并且一个行非常长的文件,可能还有一些 宽泛的性格(例如 Unicode)被视为二进制文件。使用 。 gittribute文件,您可以定义 Git 如何解释该文件。通过手动设置 差异属性,Git 可以将文件内容解释为文本,并执行通常的 diff 操作。

只需将 。 gittribute添加到存储库根文件夹,并将 差异属性设置为路径或文件。这里有一个例子:

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 属性的引用可以在 给你中找到。

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

在我的案例中,不知何故(可能是由于某个地方的 git 合并不好) ,VS 丢失了整个项目的一个引用。它仍在建设,但我注意到,它只建立了依赖。

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

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

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

我遇到过这样一个问题,Git GUI 和 SourceTree 将 Java/JS 文件作为二进制文件处理,因此不会显示差异。

.git/info中创建一个包含以下内容的名为 attributes的文件解决了这个问题:

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

如果您希望将此应用于所有存储库,那么可以在 $HOME/.config/git/attributes中添加文件 attributes

我们有个案子。无论何时我们尝试对 html 文件进行更改,它都被视为二进制文件。看不出区别是很不酷的。老实说,我并没有检查所有的解决方案,但对我们有效的是以下几点:

    删除文件(实际上是移动到我的桌面上)并提交 Git 说 Deleted file with mode 100644 (Regular) Binary file differs 重新添加文件(实际移动 它从我的桌面返回到项目)。 Git 说 New file with mode 100644 (Regular) 1 chunk, 135 insertions, 0 deletions文件 现在添加为常规文本文件

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

尝试使用 文件查看编码细节(参考文献) :

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

我有一个实例,其中 .gitignore故意包含一个双 \r(回车)序列。

Git 将该文件标识为二进制文件。

# .gitattributes file
.gitignore diff

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

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

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

这也是由于(至少在 Windows 上)具有 带 BOM 的 UTF-8编码的文本文件造成的。将编码更改为常规 UTF-8立即使 Git 看到的文件为 type = text

在粘贴二进制卡夫卡消息中的一些文本时,我遇到了类似的问题,这些文本插入了不可见的字符,使 git 认为文件是二进制的。

通过使用正则表达式 [^ -~\n\r\t]+搜索文件,我找到了有问题的字符。

  • [匹配此集中的字符
  • ^匹配不在此集中的字符
  • -~匹配从’(空格)到’~’的所有字符
  • \n新线
  • \r回程车
  • \t标签
  • ]准备完毕
  • +匹配这些字符中的一个或多个

我的文件显示为二进制文件(使用 git diff或 SourceTree 时 dI 没有差异)的原因是因为有问题的文件被添加为 Git LFS 文件

Git (和 SourceTree)似乎不能区分添加到 LFS 的文本文件。然而,经过一段时间的打猎,我可以通过跑步来解决这个问题。 git config --global diff.lfs.textconv cat

在这里的建议的帮助下... ..。 https://github.com/git-lfs/git-lfs/issues/440#issuecomment-501007460

当我在 Powershell 终端使用 echo 命令生成差异化的文件时,我得到了相同的信息:

echo "new file" > newfile.txt

即使在我用编辑器打开和编辑它们之后,这些文件仍然是二进制的。

对我来说,最快捷的解决方案是复制这些文件的内容,删除它们,然后直接从编辑器(而不是终端)再次创建它们,并粘贴回内容。之后的 Diff 显示了正确的每行冲突,正如人们所预期的那样。