SourceTree 无法显示大型文本文件的GIT差异 (或将其视为二进制文件)。

6

我正尝试使用GIT来跟踪一个相当大(约3MB)的XML文件的更改。该文件采用UTF-8编码,以及CRLF换行符(我在Windows 10上工作)。但是由于某些原因,GIT一直认为它是二进制文件,而无法显示任何差异。或者说它无法检测到更改。

Sourcetree中的差异显示消息为“未检测到此文件中的更改,或者它是二进制文件”

我尝试在.gitattributes中显式设置属性,但似乎这不是原因:

 *.xml crlf diff

   git check-attr --all -- sorkin.xml
   sorkin.xml: diff: set
   sorkin.xml: crlf: set 

我发现当我将大文件分成三个小于1MB的部分时,GIT可以正确地显示它们的更改情况。
在计算差异时,GIT是否有文件大小的限制?

2
你确定它是UTF-8吗?如果Git认为它是二进制文件(并且显示“Binary files differ”或类似的内容),通常意味着它在Windows上是UTF-16编码。 - bk2204
剩余的2MB中可能有零字节吗?请参见此问题,了解git如何检测二进制文件的说明。 - LeGEC
我非常确定它是UTF-8编码,使用Notepad++和https://onlineutf8tools.com/validate-utf8进行了测试。 - Alexander Sorkin
检查了零字节 - 用十六进制编辑器搜索了文件。不,文件中没有零字节。 - Alexander Sorkin
在Windows上,我使用GitExtension(可惜只有Windows版本)。SourceTree的Windows版本很慢,很烦人。在MacOS上运行得更好。所以,与其与一个工具斗争,不如尝试其他东西。 - Marek R
1个回答

17
问题不在GIT选项中,而是在SourceTree的设置工具/选项/差异中。默认情况下,它为文本文件的内部差异视图设置了1024Kb的大小限制。
我将其设置为更高的值,并解决了我的问题。
我错误地解释了SourceTree的错误消息:“未检测到此文件的更改,或者它是二进制文件”。但当我创建一个长度为1048576和1048577字节的文本文件并提交它们时,我发现git diff命令行可用,而Atlassian SourceTree则忽略更改量更大的文件。
对于git diff,使用正确的语法很重要: git diff commit_hash 1048577.txt 而不是 git diff 1048577.txt ,因为最后一个命令显示HEAD和当前更改之间的差异,这是我误解问题的第二个因素。

1
不幸的是,SourceTree错误信息“未检测到此文件中的更改,或者它是二进制文件”可能会有多个原因。如果文件大小大于在SourceTree选项面板中设置的大小,则可以预期收到此消息。如果您的文本文件未编码为UTF-8,则还会收到此消息。您可以通过以下方式克服大小问题:工具/选项/差异。您可以在此处克服UTF-8 UTF-16问题:https://dev59.com/qXRA5IYBdhLWcg3w8SeJ?rq=1 - Rod Dewell

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