git add .
少し手間はかかるかもしれませんが、インデックスに追加したすべてのファイルを復元できます(たとえば、状況によっては)。インデックスにファイルを追加するために、gitはそれをオブジェクトデータベースに追加します。つまり、ガベージコレクションがまだ行われていない限り、ファイルを回復できます。これを行う方法の例は、JakubNarębskiの回答にあります。
しかし、それをテストリポジトリで試してみたところ、いくつかの問題がありました-ある--cached
はずですが--cache
、実際には.git/lost-found
ディレクトリが作成されないことがわかりました。ただし、次の手順でうまくいきました。
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)")
これにより、オブジェクトデータベース内のすべてのオブジェクトが出力されます。これらのオブジェクトは、参照によって、インデックス内で、または参照ログを介して到達できません。出力は次のようになります。
unreachable blob 907b308167f0880fb2a5c0e1614bb0c7620f9dc3
unreachable blob 72663d3adcf67548b9e0f0b2eeef62bce3d53e03
...そしてそれらの各ブロブに対して、あなたは次のことができます:
git show 907b308
ファイルの内容を出力します。
出力が多すぎますか?
以下のseheのコメントに応じて更新:
そのコマンドの出力に多くのコミットとツリーがリストされていることがわかった場合は、参照されていないコミットから参照されているオブジェクトを出力から削除することができます。(通常、いずれにせよreflogを介してこれらのコミットに戻ることができます-インデックスに追加されたが、コミットを介して見つけることができないオブジェクトにのみ関心があります。)
最初に、コマンドの出力を次のように保存します。
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") > all
これらの到達不能なコミットのオブジェクト名は、次のようにして見つけることができます。
egrep commit all | cut -d ' ' -f 3
したがって、インデックスに追加されているが、どの時点でもコミットされていないツリーとオブジェクトだけを見つけることができます。
git fsck --cache --unreachable $(git for-each-ref --format="%(objectname)") \
$(egrep commit all | cut -d ' ' -f 3)
これにより、考慮しなければならないオブジェクトの数が大幅に削減されます。
更新: 以下のPhilip Oakleyは、検討するオブジェクトの数を減らす別の方法を提案しています.git/objects
。あなたはこれらを見つけることができます:
find .git/objects/ -type f -printf '%TY-%Tm-%Td %TT %p\n' | sort
(このfind
呼び出しはここで見つかりました。)そのリストの最後は次のようになります。
2011-08-22 11:43:43.0234896770 .git/objects/b2/1700b09c0bc0fc848f67dd751a9e4ea5b4133b
2011-09-13 07:36:37.5868133260 .git/objects/de/629830603289ef159268f443da79968360913a
この場合、これらのオブジェクトは次のように表示できます。
git show b21700b09c0bc0fc848f67dd751a9e4ea5b4133b
git show de629830603289ef159268f443da79968360913a
(/
オブジェクト名を取得するには、パスの最後にあるを削除する必要があることに注意してください。)