Git

如何恢復損壞/部分刪除的 git 儲存庫

  • June 2, 2015

我不小心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>

恢復分支後,您可以復製配置文件,並且您應該非常接近最新送出時的位置。

引用自:https://unix.stackexchange.com/questions/66891