如何修复损坏的git存储库 - "git fsck"报告"树中的警告[hash]:包含指向null sha1的条目"

Bla*_*huk 5 git git-fsck

概述:

我无法成功将我们的仓库中的更改提取到生产服务器.

在我的repo上运行"git fsck"返回了同样错误的5个实例:

warning in tree [hash]: contains entries pointing to a null sha1
Run Code Online (Sandbox Code Playgroud)

我们的所有版本的repo都存在错误,包括bitbucket上托管的版本.

我和我的同事在我们非常希望保留的本地版本的回购中都有未经删除和未提交的更改.

我已经尝试了google,stackoverflow和man page,但是我找不到一个好的指南来解释发生了什么或如何解决问题.

在谈到GIT时,我的同事和我是相对的新手.我们已经掌握了基础知识,但我们还没有在低级命令中花费任何时间.

我很感激任何和所有帮助恢复我的回购的完整性.

详细说明:

当我尝试将远程分支拉到生产服务器时,我的问题就出现了.它应该是对工作目录的简单更新,但我得到一些模糊的错误,我不记得,发现我的工作目录已损坏.

合并失败后,Git状态报告了大量未跟踪和修改的文件.我无法弄清楚如何使用git命令解决问题所以我手动操作文件系统以删除文件(但我没有触及.git目录中的任何内容)并让我的工作目录回到我的状态生产服务器将无误地为我的网站服务.

在我的repo上运行"git fsck"返回了同样错误的5个实例:

warning in tree [hash]: contains entries pointing to a null sha1
Run Code Online (Sandbox Code Playgroud)

我跑了git fsck:

  • 我的开发机器上的回购
  • 我的同事的开发机器
  • dev和prod上来自bitbucket的新克隆版本回购

我试过的一切都显示出相同的警告.所以无论问题是什么,它都在我们的回购的所有版本中.

调用"git ls-tree [树形哈希报告错误]"显示正常的目录打印输出以及坏树哈希:

160000 commit 0000000000000000000000000000000000000000 [name of repo]
Run Code Online (Sandbox Code Playgroud)

我找到的最接近解决方案的是这个stackoverflow帖子:如何在Git树中删除带有null sha1的条目.但是,我无法真正理解这些步骤,切割和粘贴命令无法解决我的问题.

我的问题:

  • 这些错误究竟意味着什么?他们有多严重?
  • 我们如何修复我们的回购(如果可能的话,请一步一步地为我们的新手)?
  • 在我们修复之前或之后,我们是否应该承诺并将所有更改推送到回购?
  • 修复回购有什么影响?我们如何将修复分发到所有版本的repo(例如dev机器和生产服务器)?
  • 导致此错误的原因是什么?我们如何防止它再次发生?

Ano*_*noE 0

这个问题很老了;不过,也许它对其他人有帮助。

  • 这个错误可能意味着您曾经有过子模块,后来删除了它们,并且出现了问题。
  • 如何修复很大程度上取决于所涉及的树木的具体外观。关键是要充分了解 git 的内部结构,以便弄清楚要做什么。这实际上并不难,因为 git 的根源只有少数概念。查看https://git-scm.com/book/en/v2/Git-Internals-Git-Objects。您链接的问题有一个带有非常好的指示的答案。
  • 我会这样做:
    • 制作存储库的本地副本(使用操作系统文件工具,而不是 git),然后git reset --hard在副本中执行 a,然后修复所有内容。
    • 将此固定存储库发送到新的遥控器,以便您的朋友可以拿起它。
    • 你们俩都从原始存储库复制本地更改,再次使用cp,而不是 git。
    • 像往常一样提交、推送、拉取,直到这三个新存储库正常为止。- 扔掉旧的本地存储库,用git push --all --force.
  • 其影响取决于实际修复的复杂程度。但它可能类似于一个巨大的 rebase,即到处都是新的提交哈希,并且 git 给你“分歧分支”消息,其中有数百个提交。你不应该失去历史。我建议不要在新旧存储库之间推/拉/合并。
  • 原因可能是一些子模块的恶作剧,因为子模块是导致提交哈希出现在树中的一件事。为了避免...避免子模块?很难说。