巨大なファイルがあるとクローンに時間がかかる

Gitリポジトリに巨大なファイルをコミットするとクローンに時間がかかるようになる。

下記の手順で調査を行うことで巨大なファイルを特定できる。特定したファイルを履歴から抹消することでリポジトリのサイズを小さくすることができる。

オブジェクトファイルをパッキングする

下記コマンドを実行してpackfileを作成する。クローン直後であれば必要ない。

cd /path/to/repository
git gc

オブジェクトファイルをサイズ順に表示する

下記コマンドを実行するとサイズが大きい順に100件表示する。

git verify-pack -v .git/objects/pack/pack-*.idx |
grep blob |
sort -k3nr |
head -n 100 |
ruby -ane 'IO.popen("git rev-list --all --objects | grep #{$F[0]}", &:read).split.tap {|path| puts [$F[0],path[1..]&.join,$F[2],$F[3]].join("\t") }'

git verify-packpackfile内のオブジェクトの情報を表示するコマンドで下記のフォーマットで出力する。

SHA-1 type size size-in-packfile offset-in-packfile

git rev-listでオブジェクトのパスとハッシュの一覧を出力できるため1列目の情報からパスを取得し、3列目と4列目のサイズ情報を表示することでサイズの大きいファイルを特定できる。