web-dev-qa-db-ja.com

git:ぶら下がりブロブ

私は最近git fsck --lost-found私のリポジトリ。

HEADをリセットしたコミットがぶら下がっているのを見ると予想しました。

しかし、数千を超えるぶら下がりBlobメッセージが表示されるのを見て驚いた。

私のリポジトリに何か問題があるとは思わないが、これらのぶら下がりブロブの原因について興味がありますか?リポジトリで作業しているのは2人だけで、普通のことは何もしていません。

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

考えてみると、ある時点で、非常に大きなディレクトリ(数千のファイル)を誤ってプロジェクトに追加してから削除しました。これがぶら下がりのすべての塊の原因かもしれませんか?

このミステリーへの洞察を探しています。

60
wadesworld

前回私がこれを見たとき、私は このスレッド 、特にこの部分に出くわしました:

また、パック内のオブジェクトがぶら下がることもあります。そのパックが再パックされると、それらのオブジェクトは緩められ、その後、上記のルールに従って最終的に期限切れになります。ただし、gcは常に古いパックを再パックするとは限りません。たくさんのパックができるまで新しいパックを作成し、それらをすべて組み合わせます(少なくとも "gc --auto"が行うことです。 "git gc"だけが同じルールに従うかどうかは思い出せません)。

だから、それは正常な動作であり、最終的に収集されると思います。

編集:ダニエルによると、あなたはすぐにそれを収集することができます

git gc --Prune="0 days"
51
Waynn Lue

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

git gc --Prune="0 days"
24
Daniel

インデックスにファイルをaddするたびに、そのファイルのコンテンツがGitのオブジェクトデータベースにblobとして追加されます。次にreset/rm --cachedそのファイル、blobはまだ存在します(次回gcを実行したときにガベージコレクションされます)

ただし、これらのファイルがコミットの一部であり、後でreset履歴に決定した場合、古いコミットはGitのreflogから到達可能であり、一定期間(通常は1か月、iirc )。これらのオブジェクトはまだ参照ログから参照されているため、ぶら下がりとして表示されるべきではありません。

16
knittl