実施に至るまで
開発サーバの空き容量が大分減っているとの連絡があったので、調査したところ.git/配下が一番容量を食いつぶしている事が分かった。
- デプロイしているソースの総容量は 1.3GB くらい
- 容量の大半を占めるのはUnityのビルドデータ
WebGLビルドをしていて、Asset関連がとにかく多い - .git配下の容量は気づいたら6GBほど
.git/objects/packが大半を占めている
以上のことから、過去、ビルドしては消していたUnityのWebGLビルドデータが積りに積もっている事が分かった。
どうにかして容量を削減をしたいので、以下の2案を検討して、そのうちgit gcを今回採用してみました。
案 その1
gitの履歴データを削除して、過去のビルドデータの痕跡を消す案
対応としては一番わかりやすいが、「履歴を消す」様なコマンドはgitに用意されていない。
下記の記事を参考に、メンテナンスを行うことを検討したが、WebGLビルドデータ(一回のビルドで大量のAssetsファイル群が出来る)が非常に多く、ミスが怖いので今回は見送った。
案 その2
git gcコマンドを利用して、不要なオブジェクトなどの掃除を行う案*
こちらを採用した。
- git gcコマンドのみで完結できるので、作業としては簡単に行うことが出来る。
- 開発リポジトリと本番リポジトリは分離されており、何かあった時でも対応可能。
コマンド自体はgit備え付けなので、下記の通りgcを叩くだけで実行できた。
git gc
→結果として1GBほど容量が減りました。
しかし、過去のデータが多いこともありどうせならと--aggressive + --prune
付きのgcも実行した。
git gc --agressive --prune=now
→git gc後から更に結果として2GBほど減りました。
また、--agressiveオプションをつけるとエラーが発生することがあるみたいです。
私の環境だと以下のエラーが発生しました。
error: pack-objects died of signal 975)
fatal: failed to run repack
調べてみると、メモリ容量が足りない事によるエラーの模様。
この為にスペックアップするのも微妙なので、packするときに割り振られるメモリ容量を制限しました。
## --globalオプションはつけず、作業しているリポジトリのみに適用
git config pack.windowMemory 512m
git config pack.packSizeLimit 512m
git config pack.threads 1
ここまでで、agressive込みのgit gc
完了
最後に
gitだからといって、どかどかファイルコミットするのはやっぱり微妙でした。反省。。
(過去のコミットに戻れるのだから、どこかでオブジェクト管理をしているのは当然ではありますが…)
UnityのWebGLビルドの様に「ファイル数が多い+容量もそこそこ大きいもの」を扱う際は、デプロイの仕方などを考慮したいと思います。