如何修复损坏的Git仓库 - "git fsck"报告“树[hash]中存在指向空sha1的条目”的警告

6

概述:

我无法成功将我们的仓库中的更改拉到我们的生产服务器。

在我的仓库上运行“git fsck”返回了5个相同错误的实例:

warning in tree [hash]: contains entries pointing to a null sha1

我们代码库的所有版本,包括托管在Bitbucket上的版本,都存在该错误。
我和同事在本地代码库中都有未推送和未提交的更改,我们希望能够保存这些更改。
我已经尝试通过谷歌、Stack Overflow和man页面来解决问题,但是我找不到一个好的指南来解释发生了什么或如何解决问题。
我和我的同事在GIT方面相对新手。我们掌握了基础知识,但还没有花时间学习底层命令。
我将非常感激任何形式的帮助,以恢复我的代码库完整性。
详细描述:
当我尝试将远程分支拉到我的生产服务器时,我的问题开始出现。这应该只是一个简单的工作目录更新,但是我得到了一些模糊的错误,我记不清是什么了,并发现我的工作目录已损坏。
失败的合并后,Git状态报告了大量未跟踪和修改的文件。我无法用git命令解决问题,因此我手动操作文件系统以删除文件(但我未触及.git目录中的任何内容),并将工作目录恢复到了一个状态,我的生产服务器可以无误地提供网站服务。
在我的代码库上运行“git fsck”返回了5个相同错误的实例:
warning in tree [hash]: contains entries pointing to a null sha1

我在以下位置运行了git fsck:

  • 我的开发机上的存储库
  • 我的同事的开发机
  • 从bitbucket上克隆的全新版本存储库,在开发和生产环境中都是如此

无论我尝试什么,都显示相同的警告。所以无论问题是什么,它都存在于我们存储库的所有版本中。

调用“git ls-tree [ tree hash reporting an error ]”会显示一个正常的目录输出,以及错误树哈希:

160000 commit 0000000000000000000000000000000000000000 [name of repo]

我找到的最接近解决方案的是这个stackoverflow帖子:如何在Git树中删除sha1为空的条目。然而,我无法真正理解步骤,复制粘贴命令也未能解决我的问题。
我的问题:
1. 这些错误是什么意思?它们有多严重? 2. 我们如何修复我们的repo(如果可能,请为我们新手一步一步地进行)? 3. 在修复之前或之后,我们应该提交和推送所有更改到repo吗? 4. 修复的影响是什么?我们如何将修复分发到repo的所有版本(例如,到开发机器和生产服务器)? 5. 是什么导致了这个错误?我们如何防止它再次发生?

事实证明,我的台式机内存开始出现错误(memtest86测试失败)。我相信这个坏的内存破坏了我的GIT提交,当我推送更改时,一切都变得损坏了。 - Blaine Osepchuk
1个回答

0

这个问题很老了,但或许可以帮助其他人。

  • 这个错误很可能意味着你曾经有过子模块,后来将它们去掉了,但出现了一些问题。
  • 如何修复非常取决于所涉及的树看起来像什么。关键是要足够了解git内部,以便找出该怎么做。这实际上并不难,因为git在其根源处只有少数几个概念。查看https://git-scm.com/book/en/v2/Git-Internals-Git-Objects。你链接的问题有一个答案提供了非常好的提示。
  • 我会这样做:
    • 使用操作系统文件工具(而不是git)创建一个存储库的本地副本,然后在副本中执行git reset --hard,然后修复所有问题。
    • 将这个修复后的存储库发送到新的远程位置,以便你的朋友可以接收它。
    • 你们两个都使用cp再次从原始存储库中复制你们的本地更改。
    • 像往常一样提交、推送、拉取,直到这三个新存储库正常。-丢弃你旧的本地存储库,用git push --all --force替换你旧的远程存储库。
  • 含义取决于实际修复的复杂性。但它很可能类似于一个巨大的rebase,即到处都是新的提交哈希和git给你“分叉的分支”消息,之间有数百个提交。你不应该丢失历史记录。我建议不要在旧和新存储库之间进行推送/拉取/合并。
  • 原因很可能是一些子模块的问题,因为子模块是导致提交哈希出现在树中的唯一一件事情。要避免... 避免使用子模块?很难说。

谢谢你的回答。我们最终通过编辑存储库来解决了问题(我不记得所有的细节)。 - Blaine Osepchuk

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