25

次のようなgitツリーがあります

                 A---B---C topic
                /
           D---E---F---G master     <--

トピックとその上のすべてのオブジェクトを削除したいと思います。

トピックの SHA ID をメモしてから、次のように入力します。

git branch -D topic
git gc                                   #  <-- I also tried prune here...
git checkout -b temp <SHA1 ID of topic>

最後のコマンドの後、エラーが発生することが予想されます(「存在しないオブジェクトID ...」など)。しかし、エラーはなく、gitk は上記と同じツリー構造を示していますか??

何が欠けていますか - gc/prune は到達不能なオブジェクトをすべて削除するはずだと思いましたか?

4

2 に答える 2

29

多くの場合、リポジトリ内の余分なオブジェクトを取り除くには、gc prune だけでは十分ではありません。コミットがまだ reflog で参照されている場合、それらのオブジェクトは到達不能であるとは見なされず、プルーニングの機が熟しています。

これが私のために働いたものです:

git reflog expire --expire=now --all
git gc --aggressive --prune=now
git repack -a -d -l

これにより、レポの履歴にいくつかの変更が加えられ、吹き飛ばしたブランチに他の人が依存している場合、問題が発生する可能性があります。

サイズの違いを実際に確認するには、リポジトリを再クローンする必要がある場合があります。

于 2010-12-16T04:29:33.480 に答える
6

注 2010 年 5 月: Jakub が述べたように、ブランチがマージされた場合でも、トピックには到達可能です。

ここで、マージがなかったとしましょう。
次に、ProGitの本で言及され、このSOの質問で詳しく説明されているように:

git gc --prune=now

十分なはずです(直接電話する必要がありますgit prune)。でそれを制御できますgit count-objects -v
2012 年 4 月の編集:コメントのmaxschlepzigは、 Duke回答で詳述されているように、追加の手順が必要になる可能性があることを確認しています(ただし、git repack.
したがって、代わりにgit gc --prune now

git reflog expire --expire=now --all
git gc --aggressive --prune=now
于 2010-05-21T13:34:30.910 に答える