誤って生成された数百メガバイトのガベージを削除した後でも、railsプロジェクトディレクトリの.git / objectsはまだ大量です。
git add -A
インデックスを更新し、存在しないファイルを削除するために、他のコマンドと同様に試しました。ディレクトリ内の2つの文字名を持つファイルがblobであると、おそらく間違って収集します。以前のコミットにロールバックしようとしましたが、うまくいきませんでした。
このディレクトリをクリーンアップするにはどうすればよいですか?
誤って生成された数百メガバイトのガベージを削除した後でも、railsプロジェクトディレクトリの.git / objectsはまだ大量です。
git add -A
インデックスを更新し、存在しないファイルを削除するために、他のコマンドと同様に試しました。ディレクトリ内の2つの文字名を持つファイルがblobであると、おそらく間違って収集します。以前のコミットにロールバックしようとしましたが、うまくいきませんでした。
このディレクトリをクリーンアップするにはどうすればよいですか?
回答:
ファイルを追加してから削除した場合、blobはまだ存在しますが、ぶら下がっています。git fsck
到達不能なblobを一覧表示し、git prune
それらを削除します。
ファイルを追加し、コミットしてから、でロールバックすると、ファイルgit reset --hard HEAD^
は少し深くスタックします。git fsck
ブランチのreflogがそれらを保持しているため、ぶら下がっているコミットやblobは一覧表示されません。履歴に適切なオブジェクトのみが残るようにする1つの方法は次のとおりです。
git reflog expire --expire=now --all
git repack -ad # Remove dangling objects from packfiles
git prune # Remove dangling loose objects
もう1つの方法は、リポジトリのクローンを作成することです。これは、到達可能なオブジェクトのみを運ぶためです。ただし、ぶら下がっているオブジェクトがパックされた場合(そして、多くの操作を実行した場合、gitは自動的にパックされた可能性があります)、ローカルクローンはパックファイル全体を運びます。
git clone foo bar # bad
git clone --no-hardlinks foo bar # also bad
gitに新しいパックを計算させるプロトコルを指定する必要があります。
git clone file://foo bar # good
file://foo
URLは現在のディレクトリを基準にしており、file:///home/me/foo
(3つのスラッシュ)は絶対です。
Sparkleshareは、巨大な画像のチェックインを何度もプルできなかった後、私のgitに13GBのtmp_pack_ファイルを作成しました。助けになったのは...
rm -f .git/objects/*/tmp_*
'gitgc'はそれらのファイルを削除しませんでした。
剪定して再梱包した後もまだ大きなリポジトリがある場合(gc --aggressive --prune=tomorrow
...)、奇妙なものを探しに行くことができます:
git rev-list --objects --all |
while read sha1 fname
do
echo -e "$(git cat-file -s $sha1)\t$\t$fname"
done | sort -n
これにより、サイズの昇順で並べ替えられたオブジェクトのリストが表示されます。git-filter-branchを使用して、リポジトリから原因を削除できます。
ガイダンスについては、http://progit.org/book/ch9-7.htmlの「オブジェクトの削除」を参照してください。
--aggressive
。編集しようとしましたが、そのような小さなタイプミスは編集できないことがわかりました。