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

https://git-scm.com/book/ja/v1/Git%E3%81%AE%E5%86%85%E5%81%B4-%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%82%AB%E3%83%90%E3%83%AA

http://stackoverflow.com/questions/10656794/why-do-large-files-still-exist-in-my-packfile-after-scrubbing-them-with-filter

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コマンドでコピーする。