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

时间:2015-05-28 16:24:20

标签: git git-fsck

概述:

我无法成功将回购中的更改提取到生产服务器。

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

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

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

我和我的同事都对我们非常想保留的本地版本的回购邮件进行了未经删除和未提交的更改。

我尝试过google,stackoverflow和man page,但我无法找到一个很好的指南来解释发生了什么或如何解决问题。

对于GIT来说,我的同事和我是相对的新手。我们已经掌握了基础知识但我们还没有花时间在低级命令中。

我非常感谢能够恢复我的回购的完整性。

详细说明:

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

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

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

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

我跑了git fsck:

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

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

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

160000 commit 0000000000000000000000000000000000000000 [name of repo]

我找到的最接近解决方案的是此stackoverflow帖子:How to remove an entry with null sha1 in a Git tree。但是,我无法理解这些步骤,切割和粘贴命令无法解决我的问题。

我的问题:

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

1 个答案:

答案 0 :(得分:0)

这个问题很老了;不过,也许它可以帮助别人。

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