为什么Git将某些cpp文件视为二进制文件?

6

以下是git log的输出:

* 5a831fdb34f05edd62321d1193a96b8f96486d69      HEAD (HEAD, origin/work, work)
|  LIB/xxx.cpp                        |  Bin 592994 -> 593572 bytes
|  LIB/xxx.h                          |    5 +++++
|  LIB/bbb/xxx.h                      |    9 +++++++++
|  LIB/aaa/xxx.cpp                    |  Bin 321534 -> 321536 bytes
|  LIB/aaa/yyy.cpp                    |   31 +++++++------------------------
|  tests/aaa/xxx.cpp                  |   29 +++++++++++++++++++++++++++++
|  tests/test_xxx.vcproj              |    4 ++++
|  7 files changed, 54 insertions(+), 24 deletions(-)

为什么它会将某些文件视为二进制文件,而将其他文件视为非二进制文件?这会导致严重的问题,因为git也不想自动合并它们。因此,几乎所有的合并/变基/拉取操作都变得很痛苦。

这是存储库配置:

[core]
  repositoryformatversion = 0
  filemode = false
  bare = false
  logallrefupdates = true
  symlinks = false
  ignorecase = true
  hideDotFiles = dotGitOnly
[remote "origin"]
  fetch = +refs/heads/*:refs/remotes/origin/*
  url = https://xxx/project.git
[branch "master"]
  remote = origin
  merge = refs/heads/master
[branch "work"]
  remote = origin
  merge = refs/heads/work
[svn-remote "svn"]
  url = xxxx
  fetch = :refs/remotes/git-svn

在主 .gitconfig 中也要设置 core.autocrlf = false。

编辑 根据评论的建议,我将 core.autocrlf 设置为 true,但这似乎不影响我接下来要进行的合并(可能现在更改 autocrlf 太晚了?或者与问题无关?):

> git merge work
warning: Cannot merge binary files: LIB/xxx.cpp (HEAD vs. work)

warning: Cannot merge binary files: LIB/aaa/xxx.cpp (HEAD vs. work)

Auto-merging LIB/xxx.cpp
CONFLICT (content): Merge conflict in LLIB/xxx.cpp
Auto-merging LIB/xxx.h
Auto-merging LIB/aaa/xxx.cpp
CONFLICT (content): Merge conflict in LIB/aaa/xxx.cpp
Automatic merge failed; fix conflicts and then commit the result.

此外,现在的gits坚持要更改几个文件中的行尾(这是我不想要的)。

2个回答

10

尝试在$repo/.git/info/attributes中添加以下行:

*.cpp crlf diff
你可以在gitattributes中 每个仓库每个用户每个系统中指定它。

基本检查清单

• 文件中实际上是否有CRLF或LF行尾?
是,将core.autocrlf设置为true(至少针对此存储库)。


• 文件是否包含滑稽的非ASCII字符:umlauts、变音符号、表情符号、汉字、版权标志“©”、“看不见的神秘空格”等等?…
如果是,请确保所有内容都使用UTF-8编码。用代理对调试也不好玩。


• 文件内容是否以UTF-8 BOM开头?
现在删除它,没有意义。


• 文件内容是否以UTF16 BOM开头?
很遗憾;我现在没有好的建议;抱歉。请联系您的系统供应商。


3
这也可能是一个编码问题,Git 最好使用 utf-8,如果编码是 utf-16 等类似的格式,无论你在 .gitattributes 中设置什么,Git 都会认为它是二进制的。 - user456814
我并不真正清楚为什么它必须被明确设置。我猜测您在文件顶部有一个版权名称,需要使用非ASCII字符。 - j6t

5

由于某些文件的文件编码不正确,导致它们被当成二进制文件处理。如果您将这些文件转换为UTF-8(或与正常文件相同的编码),则应该可以正常工作。使用Notepad ++或其他方式更改文件编码。


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