破損または部分的に削除されたGitリポジトリを回復する方法

破損または部分的に削除されたGitリポジトリを回復する方法

誤ってrm -r.gitディレクトリから1つを実行しました。幸いなことに、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が少なくともリポジトリであることを認識し、すべてのオブジェクトを持つポイントに到達します。コピーを使用すると、問題を解決しようとしたときに追加の損傷を防ぐのにも役立ちます。

一時ストアを作成してオブジェクトをコピーするシェルコマンド:

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>保持している各ブランチのファイルが必要です。最後の行の2番目の列には、削除が完了したときにブランチの先頭にあったコミットのIDが含まれています。 HEADがどこにあるかについての情報も同じでなければなりませlogs/HEADんが、別々のHEADを使用していない場合は、ちょうどブランチを復元してから、正常にブランチを確認することをお勧めします。

元に戻す各ブランチに対して、以下を実行できます。

git branch <name> <commit_id>

ブランチを元に戻した後、設定ファイルをコピーして、最近のコミット位置に非常に近い必要があります。

おすすめ記事