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

Shu*_*hum 7 git data-recovery

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

我还有的文件:

FETCH_HEAD
ORIG_HEAD
config
gitk.cache
logs/
objects/
Run Code Online (Sandbox Code Playgroud)

我丢失的文件:

HEAD
description
hooks/
index
info/
packed-refs
refs/
Run Code Online (Sandbox Code Playgroud)

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

qqx*_*qqx 11

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

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

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

git init /tmp/recovery
cd /tmp/recovery
cp -r /path/to/broken/repo/.git/objects .git
Run Code Online (Sandbox Code Playgroud)

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

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

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

git branch <name> <commit_id>
Run Code Online (Sandbox Code Playgroud)

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