2012-03-31 6 views
57

最近私のリポジトリにgit fsck --lost-foundが見つかりました。git:ぶら下がったブロブ

私はいくつかのダングリングコミットを参照してください、私はリセットHEADを参照してください。

しかし、私は数千のぶら下がったブロブメッセージの可能性が高いと考えていました。

私のリポジトリに問題があるとは思わないが、これらのぶれを引き起こす原因は何か不思議です。リポジトリには2人しか作業していませんが、私たちは普通のことをしていません。

古いバージョンのファイルが新しいファイルに置き換えられて作成されたとは思いません。gitは両方のBLOBを保持して履歴を表示する必要があるためです。

私たちは間違いなくプロジェクトに非常に大きなディレクトリ(何千ものファイル)を追加して削除しました。これはすべてのぶら下がった塊の源になるでしょうか?

このミステリーの洞察を探しているだけです。

答えて

49

私はthis threadを偶然見つけ、私はこれを見た最後の時間、特にこの部分:

あなたはまた、パック内のオブジェクトをダングリングで終わることができます。そのパックが に再パックされている場合、それらのオブジェクトは緩められ、最終的に上記のルールの下で の期限が切れます。しかし、私はgcは常に古いパックを再パック とは思わないと信じています。 パックをたくさん用意し、それらをすべて組み合わせてください(少なくとも "gc --auto"は何をしますか?)私は "git gc"が同じルールに従うかどうかを思い出さない)。

これは正常な動作であり、最終的に収集されると私は信じています。

編集:ダニエルごとに、あなたはすぐにインデックスに

git gc --prune="0 days" 
+3

それらブロブが削除された場合に何が起こりますか? – nferocious76

+0

@ nferocious76例えば、ステージングに追加されたがコミットされていないファイルを回収することはできません。その後、(rm -fを使用して)削除されました。 GCが実行されると、ファイルは正常に失われます。 –

+0

@DavidBrowerありがとうございます。したがって、リンクされていないファイルまたは参照されていないファイルも削除されます。 – nferocious76

16

たび、あなたがaddファイルを実行して、それを収集することができ、そのファイルの内容は、ブロブとしてGitリポジトリのオブジェクトデータベースに追加されます。これらのファイルは、その後、コミットとあなたがreset歴史に後で決めるの一部である場合、あなたはその後、reset/rm --cached、BLOBは依然、しかし、(彼らはゴミはあなたがgcを次回実行時に収集されます)

存在し、そのファイルとき古いコミットはまだGitのreflogから到達可能であり、ある期間(通常は1ヶ月、iirc)後にのみガベージコレクションされます。これらのオブジェクトはまだreflogから参照されているので、ぶら下がってはいけません。

+2

ファイルを修復して '追加 'すると、前のファイルも同様にぶら下がったブロブになります。 (私は一般的にシーケンスを使います:ハック、 'git add'、' git diff --cached'そして/または 'git status'を幸せにするまで、そして' git commit'を使います。 – torek

23

私は本当にせっかちと使用した:

git gc --prune="0 days" 
関連する問題