15

私はガベージコレクションをしたいというコミットをいくつか作成しましたgit subtree(何をなぜ収集できるのかを理解するための実用的な目的以上のものです)。

これらのコミットが次の方法で参照されていないことを確認済みです。

# In any reflog
> git reflog --all --no-abbrev-commit | grep <hash>
(no output)

# In any branch, local or remote
> git branch --contains <hash>
(no output)
> git branch -r --contains <hash>
(no output)

# In any tag
> git tag --contains <hash>
(no output)

# In the current index
> git rev-list HEAD | grep <hash>
(no output)

# In references from filter-branch
> ls .git/refs/original/
(the folder does not exist)

これらは、参照を含む可能性のあるgit gc ドキュメントリストの場所です。

指定されたコミットは の後もまだ存在しgit gcます。

何か不足していますか?または、このすべての参照をチェックする git 配管コマンドはありますか?

4

2 に答える 2

19

ルーズ オブジェクトを削除するたびに、次のコマンドを使用します。

rm -rf .git/refs/original/*
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
于 2013-02-21T05:33:01.390 に答える
6

コミット (または一般的にはオブジェクト) は、それらがルーズ オブジェクトにアンパックされ、少なくとも 2 週間放置されるまで、実際には削除されません。git gc --prune=now2 週間の遅延をスキップするために使用できます。

通常、git はオブジェクトを packfile にまとめます。これにより、ゆるいオブジェクトを使用するよりもはるかに優れた圧縮と効率が得られます。これは通常、 agit gcが実行されるたびに発生します。ただし、オブジェクトが参照されていない場合、 はそれgit gcをルーズ オブジェクトにアンパックします。

アンパックすると、git gc古い緩い参照されていないオブジェクトが自動的に削除されます。これは--prune=<date>フラグによって制御され、デフォルトは 2 週間前に設定されるため、2 週間以上経過した古い参照されていないオブジェクトは削除されます。を指定する--prune=nowと、現在よりも古いオブジェクトを削除するように求められます。git gcこれは基本的に、存在する参照されていないオブジェクトをすべて削除することを意味します。

于 2013-02-20T23:36:06.427 に答える