65

最近git fsck --lost-found、リポジトリで実行しました。

リセットしたところに、ぶら下がっているコミットがいくつかあると予想していましたHEAD

しかし、おそらく数千を超えるぶら下がっている blob メッセージを見て驚いた.

リポジトリに問題があるとは思いませんが、これらのぶら下がっているブロブの原因は何ですか? リポジトリの作業を行っているのは 2 人だけで、特別なことは何もしていません。

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

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

この謎への洞察を探しているだけです。

4

3 に答える 3

56

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

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

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

編集:ダニエルごとに、実行することですぐに収集できます

git gc --prune="0 days"
于 2012-03-31T12:17:04.430 に答える
27

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

git gc --prune="0 days"
于 2013-06-11T05:00:11.540 に答える
16

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

ただし、これらのファイルがコミットの一部であり、後でreset履歴を残すことにした場合、古いコミットは Git の reflog から引き続き到達可能であり、一定期間 (通常は 1 か月、iirc) 後にのみガベージ コレクションが行われます。ただし、これらのオブジェクトはまだ reflog から参照されているため、ぶら下がっているようには表示されません。

于 2012-03-31T12:18:06.013 に答える