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

85

我正在使用 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

连同许多 缺失的 blob 消息一起。

根据各种资源(例如Git - Broken Links, Missing & Dangling Trees),我只是从github重新克隆了项目并重新开始。

一旦我重新克隆了项目,前几个提交都很好,然后问题再次出现。每次重新克隆似乎不是最佳选择,并且似乎违反了使用git的想法,因此我想尝试理解发生了什么。如何诊断和解决这个问题?


@Chris 我在使用 Ubuntu 12.04 - cmhughes
如果我没有硬件故障,我会考虑卸载重新安装,可能一直回到裸机状态。 - Tony Hopkinson
@Chris 是的,我正在使用默认文件系统。 - cmhughes
@cmhughes,我建议从使用fsck进行文件系统检查开始。请注意,这必须在文件系统未挂载时完成。您可能需要使用Live CD或Live USB闪存驱动器。 - Chris
似乎之前已经有人回答过了 - 参考链接 - https://dev59.com/gXI_5IYBdhLWcg3wJfgM , https://dev59.com/XnbZa4cB1Zd3GeqPDkLu - First Zero
显示剩余4条评论
6个回答

58
根据我的早前建议, 最终目的是找到一个包含丢失元素(这里是完整树)的repo。
这就是在 "如何修复损坏的git存储库?"中所展示的内容。
但如果完整克隆无法解决问题,那么可能是以下原因之一:

更新于2016年7月,Git 2.10即将发布,现在您拥有:

git fsck --name-objects

查看 "如何修复git错误:从树到树的损坏链接" 以获取更多信息。


我按照一个竞争性答案中的说明进行了操作,这与您所描述的基本相同吗?它似乎已经起作用了(目前),但是一切都显得如此不稳定... - cmhughes
@cmhughes 是的,它很相似:基本上是解压缩。但是,如果即使是新克隆也出现了损坏,那么问题的根源往往指向“起源”:GitHub侧的远程存储库。 - VonC

10

我建议你从一个新的克隆开始,然后在未更改、未触摸的克隆上运行git fsck。我想知道(如上所述),你最初的克隆是否已损坏,但以某种方式允许你在弃用树之前执行一些操作。


7

我最近遇到一个问题,解决方法是将我的更改藏起来,执行git pull,然后从隐藏的更改中取回。我的问题可能比较浅显,所以这种方法可能并不适用于所有人,但值得一试。

以下是我隐藏更改时获得的输出:

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.

之后我把它拉了一下,然后弹出来,这样就清理干净了。不过要注意个人情况可能会有所不同。


1
当我运行 git stash 时,出现了 无法保存当前工作树状态 的错误提示。 - Joshua Pinter
是的,即使在 git stash 后出现“无法保存当前状态”的提示,您仍然可以调用 git add .、git commit -m 和 git status。 - bormat
在尝试之前先创建一个副本...我能够储藏但无法弹出回来。 - s_baldur

6
有点有趣,但这可能会帮助某些人。
我刚刚买了一台新电脑,我的代码库在一个 Dropbox 文件夹中。结果发现当我尝试开始工作时,.git 文件夹仍在同步。一旦文件夹完成同步,一切就恢复正常了。

3
这可能或可能不是最初提出的问题,但请注意,如果git命令正在运行的用户帐户由于所有权/权限问题无法再读取从您的存储库签出的所有文件,则会从git看到“致命错误:无法读取树”错误。因此,在许多情况下,首先要检查的是您在工作树中的文件是否正确设置了所有权和权限,因为这可能会修复问题。 :)

0

我遇到了相同的git错误,并尝试了git fsck,但仍然得到相同的fatal: unable to read tree ...消息。

所以我切换到一个名为develop的新分支(您可以随意命名),在该分支上完成了一些任务,然后将代码提交回远程仓库(提交到develop分支)。

之后,我将远程主分支拉到本地,然后使用以下命令将其合并到develop分支中:

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

然后切换回master分支,再次与develop分支合并。

这一次我尝试将代码推送到远程的master分支,幸运的是,问题得到了解决。不再出现fatal: unable to read tree的错误信息。


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