git - 如何从 Git 孤立提交损坏中恢复

标签 git

我最近在 git 存储库中遇到了一个我以前从未见过的错误。当我运行 git log -- *filename* 时,我收到一条错误消息:

error: inflate: data stream error (incorrect data check)
error: failed to unpack compressed delta at offset 1553801 from .git/objects/pack/pack-63394667b58dfbcf64c603738d6e4fee460e65a9.pack
fatal: packed object a205e18f2612db9d0e007d49d944d0158ed225af (stored in .git/objects/pack/pack-63394667b58dfbcf64c603738d6e4fee460e65a9.pack) is corrupt

进一步研究一下,有问题的对象是一个孤立提交指向的树对象。我通过运行 git fsck 确定了这一点,它返回了很多如下结果:

broken link from  commit 27047169d6f6dfc4b54794c2c867a17aaeb14012
              to    tree a205e18f2612db9d0e007d49d944d0158ed225af <--- this is the object above
broken link from  commit dcb7e8c97416db0e4cc8d5fbdc5bc07718841b05
              to    tree f655201563e7cfb77756b8891b7475063d7b850c
broken link from  commit 026257dfd34bdb5206b62b0ae21bf9ad1c5d0473
              to    tree 23a6dbda436b1f8d91b4ca0f695396620285ed7c
broken link from  commit 6db9a0cf7c6632a42a20f6278cfa75a8436e0d50
              to    tree efa207133f81adbca0a57ebabd711addd7f2ff58
broken link from  commit 2ab82ad80f26054fe8ea5647412051eaf95f20a1
              to    tree e010cf3090f2f1a2af61d87336c935bb89e9a56a

据我所知,这些提交中的每一个都是来自 rebase 或修改提交的旧的孤立提交。我认为当前分支指向的实际提交没有问题。如果我运行 git gc 来删除这些孤儿,我会得到与上面列出的相同的错误。我不明白为什么 gc 不直接删除孤儿提交,即使它们的树丢失了。

最后,最让我困惑的是,如果我将此存储库克隆到另一个文件夹,我会得到同样的错误!我不认为克隆应该复制孤儿​​提交。

所以我的问题有三个:

  1. 手动删除这些孤立提交的最佳方法是什么?
  2. 为什么在克隆的设置中会重现该错误?
  3. 这样的事情首先是怎么发生的?可能是 git gc 中断了?

编辑:感谢托马斯,他让我意识到我对至少其中一些提交被孤立的看法是错误的。看来我实际上正在处理我真实历史记录中的提交腐败问题。

最佳答案

问题的框架是错误的 - 相关提交并不完全是孤儿;有些确实是历史图表的一部分。这解释了为什么问题在克隆中仍然存在,以及为什么 git log 提示,如果它们都是孤立提交,那么它不应该提示。

我和一位同事交谈过,他意识到几天前他在整个文件夹中运行了文本查找替换,而没有排除 .git 文件夹。我很惊讶他会在包文件中找到纯文本字符串,但显然他确实做到了。由于这些树的内容不再匹配它们的哈希值,git 将其视为损坏。

我的同事反转了他的查找替换,并且 git fsck 现在没有显示任何错误。

关于git - 如何从 Git 孤立提交损坏中恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64104466/

相关文章:

git - 我怎样才能去掉几个旧的提交,但在 git 中保持所有其他提交不变?

windows - 将 Git 核心编辑器更改为 Notepad++ 导致问题

svn - "git add"等同于 svn?

PyCharm 中的 Git 使用预先存在的存储库

git - 在没有bash的情况下将git连接到windows 7上的github

git - 如何在不克隆 Jenkins 的情况下监听子模块的变化

git push 对于一个巨大的 repo 来说非常慢

git - 使 `git status` 忽略空格更改

git - 初始 Git 提交是否应该包含自动生成的文件?

git - 如何从本地系统帐户下运行的 rake 正确设置 git commit --author?