gitリポジトリのサイズを減らしたときのメモ
結果
↓こんな感じでやったらうまくいった。
git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch \ aaa/bbb/ccc.swf \ aaa/bbb/ddd.swf \ aaa/bbb/eee.swf \ cdn_server/' \ --prune-empty --tag-name-filter cat -- --all git gc --prune=now git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d git reflog expire --expire=now --all git gc --prune=now
push
サイズが減った後のoriginへのpush
git push origin --force --all git push origin --force --tags
http://stevelorek.com/how-to-shrink-a-git-repository.html
参考にしたURL
https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html
http://easyramble.com/git-filter-branch.html
http://dskd.jp/archives/46.html
ハマりポイント4つ メモ
- ファイルパスが間違っていると、当然、消えない。
git filter-branchを実行するとヒットしなくても処理が行われてる風な出力がある。でもサイズは減らない。
- git filter-branch をしたら最初に git gc –prune=now を実行する。
atlassianの記事やstackoverflowの回答だと、
最後にgit gc –prune=nowするだけで良さそうだけど、
試しに、小さいgitリポジトリを作って試したら、
git gc –prune=nowをやらないと
.git/objects/ の中が空だった。
空のままで、
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d git reflog expire --expire=now --all
をやっても効果がないっぽい。
最後に – –all を付ける。 git filter-branch –index-filter ‘git rm –cached –ignore-unmatch test1.swf’ –prune-empty – –all のように、最後に
– –all を付ける。
これをやらないと、別のブランチでログが残ったままになってリポジトリサイズが減らない。–tag-name-filter cat を付ける。
git filter-branch –index-filter ‘git rm –cached –ignore-unmatch \
test1.swf \
test2.swf \
test3.swf’ \
–prune-empty –tag-name-filter cat – –all
のように、
–tag-name-filter cat
を付ける。
これをやらないとタグのログが残ってリポジトリサイズが減らない。
Ref 'refs/tags/1.7.12' was rewritten WARNING: You said to rewrite tagged commits, but not the corresponding tag. WARNING: Perhaps use '--tag-name-filter cat' to rewrite the tag.
サイズが減らないときの確認方法
git log aabbcc.swf
で、gitログを見て、履歴があったら、そもそもログから消えていない。git filter-branchがうまくいっていない。
git_find_big.sh
で表示されていたら .git/objects/ の中にデータが残っている。
du -hs . du .git/objects/
履歴を消したファイルをコピーして元に戻す
git rm --cached test1.txt
のようにするとファイルは消えないけど、
git filter-branch の中で–cached を付けてもファイルが消える。
git filter-branch --index-filter 'git rm --cached --ignore-unmatch test1.txt' --prune-empty --tag-name-filter cat -- --all
今回はバイナリファイルの履歴を消したいだけだったので、
消えたファイルは、バックアップしていた同じリポジトリから、cpコマンドでコピーする。