2012-11-15 3 views
18

私はレポを小さくする必要があります。私はgitの履歴から問題のあるバイナリファイルを削除することによって、それを小さくすることができると思う: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 

答えて

17

あなたはこのような最大のオブジェクトのハッシュ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のサイズを含む出力が生成され、その出力を解析して各オブジェクトを元のファイルにバックアップするスクリプトをどこかに見ているように思います。

11

twalberg's answerです。あなたがサイズ順にファイルを一覧表示することができるように、私はループでそれを包ん:

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の変更に出力を制限します。

問題のファイルを特定したら、削除する方法についてはthisの回答をご覧ください。

+0

もっと便利です - ありがとう! – nealmcb

+0

サイズはどの単位で返されますか? –

+0

私はそれらがバイトであると信じています – MatrixManAtYrService

0

私は答えが最大のオブジェクト、ファイル、またはディレクトリを教えてくれるスクリプトを書いたhere。引数がなければ、サイズ別にソートされたすべてのオブジェクトのサイズが表示されます。 --sumまたは--directoriesに各ファイルのすべてのオブジェクトを合計して印刷するか、各ディレクトリ内のすべてのファイルに対して同じ作業を行うように指示できます。私はそれが便利だと思う!

関連する問題