【问题标题】:Why does 'git status' show binary file as modified when it's not and file modes are the same为什么'git status'显示二进制文件已修改,而文件模式相同
【发布时间】:2015-12-29 02:35:02
【问题描述】:

我在 Ubuntu 14.04 linux 上的 git repo 中添加了一些二进制文件,将这些文件推送到 GitHub 远程,然后将它们拉到 OS X El Capitan 和 Windows 10 上的现有克隆中。git status 在 OS X 和 Windows 上显示了一些这些文件被修改,即使它们没有被触及。即使在 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

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

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

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

有什么建议吗?

以下内容不再正确;如我的回答中所述,回购已得到修复。

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

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

【问题讨论】:

标签: git github


【解决方案1】:

我发现了问题所在。它与 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 涂抹过滤器。

【讨论】:

  • 你能详细说明一下吗?我也有同样的问题。在 OS X 中一切正常(我什至不需要 git lfs pull,只需 git checkout 会自动关闭大文件)。但是当我在 Linux 中克隆时,git checkout 不会自动下载文件,而且如果我在git lfs pull 中,它们都显示为已修改但未在git status 中上演。
  • 因为 git lfs init 没有在 Linux 上运行,所以没有 Git LFS 过滤器,所以当我添加新的大 .a 文件时,它们以标准方式存储在 git repo 中,即整个文件而不是链接。然后我将它们推送到远程并将它们拉到 OS X。在设置了 GIT LFS 过滤器的 OS X 上,git diff 运行 LFS clean 过滤器,我想它会将文件更改为对 LFS 存储链接的引用。因此 diff 失败了,因为它正在将存储在 repo 中的完整文件与 LFS 存储的链接进行比较。希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2015-06-08
  • 2023-03-20
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2015-11-29
  • 1970-01-01
相关资源
最近更新 更多