クライアントをウェブサイトに移行しました。私たちのコードは別のブランチにあり、マスターとリリースにマージされました。Master は、他の機能についても何度か分岐されています。これらのブランチはすべて、Web で見つけた例よりもリポジトリを少し複雑にします。
クライアントの元のメディア (主に画像と大きな CSV ファイル) も Git にチェックインされていることがわかりました。わずか 12MB 程度ですが、削除する理由はいくつかあります (特に、クライアントのファイル名に非 ASCII 文字が含まれているため、OSX 上の Vagrant ボックスの共有フォルダーとうまく機能していません)。リポジトリのサイズの内訳は次のとおりです。
$ du --max-depth 1 -h
12M ./.git
13M ./modules
2.0M ./themes
27M .
バイナリは明らかに複数のブランチに存在しますが、私が知る限り、次のようにして両方のバイナリを削除し、次にそれらに対応するリポジトリ オブジェクトを削除できるはずです。
$ git filter-branch --tree-filter "git rm -rf --ignore-unmatch modules/custom/mymigration/data/photos/*" # Did this with and without "HEAD" argument
[snip lots of output]
$ git reflog expire --expire=now --all
$ git gc --aggressive --prune=now
ただし、まだ大きな .git サブフォルダーがあります。
$ du --max-depth 1 -h
12M ./.git
1.4M ./modules
2.0M ./themes
15M .
最大のファイルは .git/objects/pack/pack-....pack です。これについて .idx ファイルを確認すると、次のようになります。
$ git verify-pack -v .git/objects/pack/pack-53c8077d0590dabcf5366589c3d6594768637f5e.idx | sort -k 3 -n | tail -n 5
オブジェクトの長いリストを取得します。これを rev-list にパイプし、移行データ ディレクトリを grep すると、次のようになります。
$ for i in `git verify-pack -v .git/objects/pack/pack-53c8077d0590dabcf5366589c3d6594768637f5e.idx | sort -k 3 -n | tail -n 5 | awk '{print $1}'`; do
git rev-list --objects --all | \
grep $i | \
grep modules/custom/mymigration/data
done
47846536601f0bc3a31093c88768b522a5500c96 modules/custom/mymigration/data/photos/Turkey.jpg
b920e36357d855352f4fdb31c17772d21c01304d modules/custom/mymigration/data/photos/Burger_Top.JPG
ご覧のとおり、写真はまだパックファイルにあります。
- このリポジトリを (完全に空の) リモートにプッシュし、そのリモートをまったく別の場所に複製すると、まだ 12MB のパック ファイルが残っています。
- このリポジトリをローカルに複製して
git clone file://path/to/old-repos new-repos
も同じ効果があります。さらに悪いことに、すべての元のブランチが消えて (おそらく予想されるように)、master しかありません。
これらのパックされたオブジェクトを取り除くためにできることはありますか? それらが非常に継続的に存在していることは、それらがまだどこかの git commit オブジェクトに関連付けられていることを示唆していますか? しようとしましrepack
たprune-packed
が、何も変わりませんでした。
さらに、最初のビットを適切に実行しないと、「それらを取り除く」だけで何かが壊れる可能性がありますか? git commit がまだ参照しているファイル オブジェクトが削除されるとどうなりますか?