如何恢复损坏/部分删除的 git 存储库

如何恢复损坏/部分删除的 git 存储库

我不小心rm -r在我的 .git 目录上运行了一个。幸运的是,rm当它到达写保护文件时停止了,但我仍然丢失了 .git 中的一些内容。

我仍然拥有的文件:

FETCH_HEAD
ORIG_HEAD
config
gitk.cache
logs/
objects/

我丢失的文件:

HEAD
description
hooks/
index
info/
packed-refs
refs/

据我所知,我失去的唯一无法重新克隆的东西是我的暂存区和裁判的变化。我已经准备好失去我的分期更改,但我真的需要恢复我的 HEAD 和我的分支。有没有办法做到这一点?比如说,通过查找没有子项的提交,检查它们以了解它们是什么并为它们创建分支?目前 git 甚至不再将我的存储库识别为存储库。

答案1

所有提交及其引用的文件都将作为对象存储在objects目录中。 Git 将它们创建为只读,因此它们应该仍然存在。

要恢复,我建议创建一个新的空存储库,并将损坏的存储库objects目录的内容复制到新存储库的目录中。这应该会让你到达 git 至少会认识到它是一个存储库并且它将拥有你的所有对象的地步。使用副本还有助于避免在尝试修复问题时造成更多损坏。

用于创建临时存储库并复制对象的 Shell 命令:

git init /tmp/recovery
cd /tmp/recovery
cp -r /path/to/broken/repo/.git/objects .git

完成后,您可以用来git fsck获取未被任何内容引用的对象的列表。这应该包括所有分支头,但也包括通过git commit --amend变基或变基而过时的任何提交。

由于您仍然拥有日志目录,这可能会提供更大的帮助。logs/refs/heads/<branch>您拥有的每个分支都应该有一个文件。最后一行的第二列将包含删除完成时位于该分支头部的提交的 ID。还应该有logs/HEAD关于 HEAD 所在位置的相同信息,但除非您一直在使用分离的 HEAD,否则最好只恢复分支,然后正常检出分支。

对于要恢复的每个分支,您可以运行:

git branch <name> <commit_id>

恢复分支后,您可以复制配置文件,并且您应该非常接近最新提交时的位置。

相关内容