我不小心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>
恢复分支后,您可以复制配置文件,并且您应该非常接近最新提交时的位置。