犬ターネット

OpenShift のリポジトリが肥大化したから削減しようとしたけどうまくいかなかったからリポジトリ作り直した

2014-10-28 openshift git

OpenShift から git clone したらリポジトリサイズ大きすぎてダウンロードに時間かかるからスリムにまでの顛末。

まずは対象 app 一式を rhc git-clone でローカルにダウンロード、どのくらいサイズあるのか調べたら 458M もあった…

# rhc git-clone [appname]  ※ [appname]は実際のアプリケーション名
# cd [appname]
# du -hs .git/objects
458M    .git/objects

git log --stat 実行してどのファイルが重たいか探す。

# git log --stat
…
path/to/aaa.zip | Bin 21330395 -> 17754473 bytes
path/to/bbb.zip | Bin 41860218 -> 37652391 bytes
path/to/ccc.zip | Bin 25494801 -> 20683412 bytes
path/to/ddd.zip | Bin 20664210 -> 20660728 bytes
…

zipファイルで結構容量喰ってることが分かった。zipファイルそのものはもう削除してるんだけど、履歴には残っていてそれが容量喰っているということだ。

ということで以下コマンド流して zip ファイルをリポジトリから強制削除。

# git filter-branch -f --index-filter 'git rm -rf --cached --ignore-unmatch path/to/aaa.zip'
# git filter-branch -f --index-filter 'git rm -rf --cached --ignore-unmatch path/to/bbb.zip'
# git filter-branch -f --index-filter 'git rm -rf --cached --ignore-unmatch path/to/ccc.zip'
# git filter-branch -f --index-filter 'git rm -rf --cached --ignore-unmatch path/to/ddd.zip'

最後に git gc で最適化。

# git gc --prune=now

でも全然サイズ小さくならない。なぜだ…

# du -hs .git/objects
458M    .git/objects

何度も試したんだけど全然サイズ小さくならないから結局リポジトリ作り直した。OpenShift のフォーラムにリポジトリ作り直し手順が載ってるからその手順通りにやった。

How-to: Erase all history from a git repository on OpenShift and start over with your current files as the Initial Commit | OpenShift Forums

まず rhc ssh [appname] で ssh ログイン、リポジトリディレクトリのバックアップを取っておく(うまくいったらあとで消す)

# rhc ssh [appname]
# cd $OPENSHIFT_REPO_DIR/../
# cp -R repo repo_bak

次に ~/git/ ディレクトリに移動してリポジトリを作り直す。これでリモートの作業は終わり。

# cd ~/git/
# rm -rf [appname].git # [appname].git/hooks 以下は権限の関係で削除できないけどOK
# cd [appname].git
# git init --bare
# exit

最後にローカルでリポジトリを再作成、リモートに push しておわり。

# cd [appname]
# rm -rf .git
# git init
# git remote add origin [gitリポジトリURL。OpenShiftコントロールパネルまたは rhc app-show [appname] で確認可能] 
# git add .
# git commit -am "initial commit"
# git push origin master

念のため rhc git-clone してリポジトリサイズ確認。458M → 92K に減った。成功。

# rhc git-clone [appname]
# cd [appname]
# du -hs .git/objects
92K     .git/objects

容量喰うファイルはバージョン管理から外しておくべき…


バンド名について

解体途中