29

レポを小さくする必要があります。問題のあるバイナリ ファイルを git 履歴から削除することで、サイズを小さくできると思います。

git filter-branch --index-filter 'git rm --cached --ignore-unmatch BigFile'

そして、オブジェクトを解放します:

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --aggressive --prune=now

(これらのコマンドが間違っている場合は、お気軽にコメントしてください。)

問題: これらの大きなファイルを特定して、git 履歴から削除するかどうかを判断するにはどうすればよいですか? ほとんどの場合、それらはもう作業ツリーにありません - それらは削除されており、おそらく追跡されていません:

git rm --cached BigFile
4

5 に答える 5

25

twalbergの答えはうまくいきます。サイズ順にファイルをリストできるように、ループにまとめました。

while read -r largefile; do
    echo $largefile | awk '{printf "%s %s ", $1, $3 ; system("git rev-list --all --objects | grep " $1 " | cut -d \" \" -f 2-")}'
done <<< "$(git rev-list --all --objects | awk '{print $1}' | git cat-file --batch-check | sort -k3nr | head -n 20)"

head -n 20出力を上位 20 件に制限します。必要に応じて変更します。

問題のあるファイルを特定したら、この回答を確認して、それらを削除する方法を確認してください。

于 2015-09-10T15:45:38.447 に答える
23

次のような最大のオブジェクトのハッシュIDを見つけることができます。

git rev-list --all --objects | awk '{print $1}' | git cat-file --batch-check | sort -k3nr

次に、特定のSHAについて、これを実行してファイル名を取得できます。

git rev-list --all --objects | grep <SHA>

それを行うためのより効率的な方法があるかどうかはわかりません。すべてがパックファイル(ルーズオブジェクトではない)にgit verify-pack -vあり、サイズを含む出力を生成することが確実にわかっている場合、その出力を解析して各オブジェクトを元のファイルと照合するスクリプトをどこかで見たのを覚えているようです。

于 2012-11-15T20:01:44.897 に答える