我不小心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/HEAD
HEAD 所在的位置也应该有相同的信息,但除非您一直在使用分离的 HEAD,否则最好只恢复分支,然后正常检出分支。
对于要恢复的每个分支,您可以运行:
git branch <name> <commit_id>
Run Code Online (Sandbox Code Playgroud)
恢复分支后,您可以复制配置文件,并且您应该非常接近您在最新提交时所处的位置。
归档时间: |
|
查看次数: |
9548 次 |
最近记录: |