如何诊断和修复 git 致命: 无法读取树

我正在使用 git来管理项目中的文件,并且一直遇到这个问题。

当我运行 git status时,我得到了消息

fatal: unable to read tree e2d920161d41631066945a3cbcd1b043de919570

根据我的理解,我应该检查 git fsck的输出,然后接收

broken link from    tree e09a42f248afff64336fbbec2523df97c26451ac
to    tree e2d920161d41631066945a3cbcd1b043de919570
broken link from    tree e09a42f248afff64336fbbec2523df97c26451ac
to    tree 9b0dd389bd7f9e8d257395d57e0881b7957f9698
broken link from    tree e09a42f248afff64336fbbec2523df97c26451ac
to    tree 9e288a4ad60d63f342dfd18237980674426aa725
broken link from    tree e09a42f248afff64336fbbec2523df97c26451ac
to    tree 2a04647337089f554fab8c49cfd37149e5f4fc9f
broken link from    tree e09a42f248afff64336fbbec2523df97c26451ac
to    tree ea16658b45ce961adc3c3f519b0e8d9672918ca8

还有很多 missing blob信息。

根据各种资源(例如 Git-断链,丢失和晃动的树) ,我简单地从 github重新克隆了项目并重新开始。

一旦我重新克隆了这个项目,对于一些 commit来说一切都很好,然后问题又出现了。每次重复克隆似乎都不是最佳选择,而且似乎违背了使用 git的想法,我想试着了解到底发生了什么。我如何诊断和修复这个问题?

113762 次浏览

跟随我的 旧的推荐信,它归结为能够找到一个实际上包含缺失元素的回购(在这里完整的树)。
这就是“ 如何修复损坏的 git 存储库?”所显示的内容。

但如果一个完整的克隆不能解决这个问题,那么它可能是:


2016年7月更新,Git 2.10即将发布,你现在有了:

git fsck --name-objects

更多信息请参见“ 如何修复从一棵树到另一棵树的 git 错误断开的链接?”。

我将从一个新的克隆开始,然后在未改动的克隆上运行 git fsck。我想知道(如上所述)您的初始克隆是否已损坏,但在某种程度上允许您在使这些树成为孤儿之前执行一些操作。

这可能是最初在这里提出的问题,也可能不是,但是请注意,如果运行 git 命令的用户帐户由于所有权/权限问题不再能够读取从存储库检出的所有文件,那么您将看到来自 git 的一个“致命的: 无法读取树”错误。

因此,在许多情况下,首先要检查的是您已经正确地设置了工作树中的文件的所有权和权限,因为这可能很好地解决了问题。:)

对我有效的方法是存储更改,执行 git 提取操作,然后将更改从存储堆栈中弹出。我的腐败可能是相当肤浅的,所以它可能不会适用于每个人,但它值得一试。

这是我藏起来时得到的结果:

work@home ~/code/project $ git stash
fatal: unable to read tree 5fd5f4d0425b42e5b478773fa643dd6fd4918188
fatal: unable to read tree 5fd5f4d0425b42e5b478773fa643dd6fd4918188
Saved working directory and index state WIP on master: d93430c Generic commit msg.
HEAD is now at d93430c An older generic message.

之后,我拉,然后弹出,它清理自己。再次,YMMV。

有点好笑,但这可能对某人有帮助。

我刚买了一台新电脑,我的存储库在 Dropbox 文件夹里。结果发现 .git文件夹在我上班的时候还在同步。文件夹同步完成后,一切正常。

我得到了相同的 git错误,并尝试了 git fsck,但没有任何改变——仍然得到相同的 fatal: unable to read tree ...消息。

因此,我只是签出到一个新的分支称为 开发(你可以命名它是什么) ,完成了一些任务的分支,然后提交代码回远程回收再次(到 开发分支)。

之后,我将远程主机拖放到本地,然后使用以下方法将其合并到开发分支:

$ git pull origin master --allow-unrelated-histories

然后签出返回到 师父分支,然后再次与 开发分支合并。

这次我尝试将代码推送到远程 师父分支,幸运的是,问题得到了解决。再也没有 fatal: unable to read tree消息了。