2015-12-29 51 views
5

我在Ubuntu 14.04 linux上添加了一些二进制文件到git repo,将这些文件推送到GitHub远程,然后将它们拉到现有的克隆在OS X El Capitan和Windows 10上。git status在OS X和Windows上显示了一些这样的文件,尽管它们还没有被触摸过。即使在git reset --hardgit checkout之后,它仍然显示它们已经改变。为什么'git status'显示二进制文件被修改,当它不是和文件模式相同

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

这里是git diff在OS X上的输出,其中只有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 

的文件被标记为.gitattributes-text所以不应该有任何问题与EOL标记。还有什么可能导致不同的sha1结果和git diff报告二进制文件不同?

我添加了一个diff=bin.gitattributes对于其中bin使用textconv = hexdump -v -C*.a文件。在此之后git diff报告没有区别,但git status仍显示修改的文件。

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

有什么建议吗?

以下情况不再属实;回购已按照我的回答中的描述进行了修正。

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

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

+0

您是否在Mac和Windows主机上正确配置了git-lfs? –

+0

也许这是有关的存取权限: http://stackoverflow.com/questions/1580596/how-do-i-make-git-ignore-file-mode-chmod-changes –

回答

4

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

在Linux主机上运行git lfs init,删除&将二进制文件重新添加到存储库中,并推送到远程已解决该问题。要将更新提供给OS X和Windows主机,我必须在它们上运行git reset --hard以重置为没有违规文件的提交。

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

+0

你能否详细说明这一点吗?我也有同样的问题。在OS X中一切正常(我甚至不需要执行'git lfs pull',只需'git checkout'就会自动关闭大文件)。但是,当我在Linux中克隆时,'git checkout'不会自动下载这些文件,而且,如果我'git lfs pull',我都会显示修改过的,但不会在'git status'中登台。 – cjbottaro

+0

因为git lfs init没有在Linux上运行,所以没有Git LFS过滤器,所以当我添加新的大型.a文件时,它们以标准方式存储在git repo中,即整个文件而不是链接。然后我将它们推送到远程并将它们拖到OS X上。在设置了GIT LFS过滤器的OS X上,git diff运行LFS clean过滤器,我假定将该文件更改为对LFS存储链接的引用。所以diff比较失败,因为它比较了存储在repo中的完整文件和链接到LFS存储。希望这可以帮助。 – msc

相关问题