我遇到过这样的情况:git fsck调用返回多个损坏的链接。这是因为,对于此存储库,rm运行了一个命令并删除了多个写保护文件(发生了错误)。该存储库也没有最近的备份(再次犯了错误)。由于正在使用 Git,存储库并未完全丢失,但一些历史记录已被打乱。直到最近要重新同步到源时,这一点才被注意到,但由于历史记录被破坏,这一点失败了。
我想修复此历史记录(如果可能),以便它可以与上游源合并。我认识到我将无法取回完整的历史记录,因为某些文件刚刚消失,但我想在正常工作的情况下尽可能保留其中的内容。
我审阅了 Linus 的电子邮件“如何恢复损坏的 blob 对象”(麻省理工学院托管副本),并且还查看了:
与许多其他人一起,但我没有看到太多关于从提交到提交错误的断开链接的建议。请注意,我确实制作了此存储库的副本,因此我不会擦除任何内容。
的结果git fsck是
$ git fsck
broken link from commit <SHA1>
to commit <SHA2>
broken link from tree <SHA3>
to blob <SHA4>
...
dangling blob <SHA5>
missing commit <SHA2>
missing blob <SHA4>
...
Run Code Online (Sandbox Code Playgroud)
当我最终通过 git 历史记录时,git log我收到错误
error: Could not read <SHA2>
fatal: Failed to traverse parents of commit <SHA1>
Run Code Online (Sandbox Code Playgroud)
它靠近最后一个备份存在的位置,但不完全在那里,所以我没有重叠的覆盖范围。我想尝试反向遍历历史,认为我可以将日志从最旧的提交移动到最新的提交,但是
$ git log --reverse …Run Code Online (Sandbox Code Playgroud)