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 甚至不再將我的儲存庫辨識為儲存庫。
所有送出和它們引用的文件都將作為對象儲存在
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。HEAD 的位置也應該logs/HEAD
有相同的資訊,但除非您一直在使用分離的 HEAD,否則最好恢復分支然後正常檢出分支。對於您要恢復的每個分支,您可以執行:
git branch <name> <commit_id>
恢復分支後,您可以復製配置文件,並且您應該非常接近最新送出時的位置。