为什么'git status'将二进制文件显示为已修改,如果不是,则文件模式相同

时间:2015-12-29 02:35:03

标签: git github

我在Ubuntu 14.04 linux上的git repo中添加了一些二进制文件,将这些文件推送到GitHub远程,然后将它们拉到OS X El Capitan和Windows 10上的现有克隆。在OS X和Windows上显示git status其中一些文件已被修改,即使它们尚未被触及。即使在git reset --hardgit checkout之后,它仍会继续显示为已更改。

注意,我正在使用带有这些文件的Git LFS(大文件存储)。

以下是OS X上git diff的输出,其中只有1个文件显示为已修改:

Marks-MacBook:KTX mark$ git diff other_lib/linux/Release-x64/libSDL2main.a
diff --git a/other_lib/linux/Release-x64/libSDL2main.a b/other_lib/linux/Release-x64/libSDL2main.a
index 4202f6f..2797199 100644
Binary files a/other_lib/linux/Release-x64/libSDL2main.a and b/other_lib/linux/Release-x64/libSDL2main.a differ

Marks-MacBook:KTX mark$ git diff --raw other_lib/linux/Release-x64/libSDL2main.a
:100644 100644 4202f6f... 0000000... M  other_lib/linux/Release-x64/libSDL2main.a

文件在-text中标记为.gitattributes,因此EOL标记不应出现任何问题。还有什么可能导致不同的sha1结果和git diff报告二进制文件不同?

我为diff=bin使用.gitattributes *.a的{​​{1}}个文件添加了bin textconv = hexdump -v -C。在此git diff报告之后没有差异,但git status仍然会将文件显示为已修改。

作为一个额外的测试,我将原始的.a文件从linux复制到OS X并使用diff将其与我的git工作树中的副本进行比较。它们完全相同。 linux repo clone上的git status报告我复制的工作树文件是未修改的。

有什么建议吗?

以下不再适用;回购已按照我的回答中所述修复。

你可以尝试自己。回购& branch位于https://github.com/KhronosGroup/KTX/tree/incoming的GitHub上。显示OS X上的问题的文件是other_lib/linux/Release-x64/libSDL2main.a.a下的任何其他other_lib/linux文件都没有问题。

在Windows上,更多文件显示为已修改,包括一些在Linux上为符号链接的文件。我现在想专注于OS X案例,因为它更简单。

1 个答案:

答案 0 :(得分:4)

我弄明白了这个问题。它是在Linux主机上的配置。感谢Edward Thomson提示我查看git-lfs配置。

在Linux主机上运行git lfs init,删除&将二进制文件重新添加到那里的repo并推送到远程已修复了问题。要将更新提取到OS X和Windows主机,我必须在它们上运行git reset --hard以重置回提交而不会有违规文件。

我没有运行git lfs init,因为我认为此步骤将成为apt-get install运行的脚本的一部分。这意味着文件实际上并未存储在LFS中,因为Linux主机上的涂抹和清除过滤器都是无操作,但.gitattributes文件导致OS X和Windows主机运行LFS涂抹过滤器结帐。