Recovery from git repo corruption

git clone 的时候发生 error: corrupt loose object 错误,费了一番功夫终于恢复了出来。

问题描述

一个很长时间没有维护的代码树忽然不能克隆了,某个对象出现了错误。具体错误信息的关键字是 corrupt loose object。这个问题我从前遇到过,估计是某次内核文件系统的BUG引入的,不知道我的硬盘上还有多少文件隐藏着问题。处理方法也不难,只要找到对应的文件,并用备份的文件进行替换就好了。可是这次替换回去发现还是不行,竟然连备份也是坏的。接着开始在各个电脑上找备份,而最终以失败告终。

问题解决

最后还是在网上找到了一篇文章,指引我参考了 git 自带的文档:recover-corrupted-blob-object.txt,具体的操作过程和文档不太相同,记录如下:

首先把有问题的 object file 删掉,然后执行 git-fsck --full,按照文档,这里应该会提示一个 broken link from … 的信息,这样就找到了链接到丢失文件的目标,然后通过 git ls-tree 找到坏掉文件所对应的源码。可我这里没有 broken link from 的信息,所以我通过另外的命令:

$ git log --raw --all

从输出信息中找到对应丢失的目标文件,也就可以知道对应的源文件是什么了。我的情况比较简单,对应的源文件正好是最新的版本——也许这也是没有 broken link 消息的原因——之后就通过下面的命令恢复了丢失的目标文件

$ git hash-object -w my-magic-file

后记

这次经历让我对 git 的内部文件组织有了更深入的了解,并且也提示了我备份的重要。重要的东西至少应该备份到不同的电脑上,而且还要保证及时的同步更新。比如我可以保存到 VPS 上,但这也要求 VPS 的稳定和安全。另外,git 的可恢复性还是不错的,重要的数据即使不是源代码也可以通过 git 来保存,这样也可以简化同步的过程。