すぐ忘れそうなので、自分用のメモとして
参考にした記事
問題
かなり前に作ってGit管理など何もしていなかった状態のサイトを、サーバーの載せ替えをする際に起きた問題。
FTPでダウンロードしたファイルをすべてGit管理に放り込んでpushしたところ、容量が大きすぎてpushできないよと怒られました。
無駄に大きいPDFファイルなどを、.gitignore
に書いて git rm -rf --cached <ディレクトリorファイル>
してGit管理から外したのですが、それでも容量が大きいと怒られたので困っていました。
原因
重いファイルはGit管理を外したのに、何がそんなに重いのかと調べたら、 .git/objects
がかなり重いようでした。
Gitで履歴をすべて記録しているので当たり前ですね。
まだリモートリポジトリにpushもしていなかったので、ローカルのリポジトリごと一旦消して作り直しても良かったのですが、なんとなくコミット履歴自体は残しておきたかったので、対処法を探してみました。
対処法
冒頭に貼った参考サイトが全てです。
filter-branch
を使えばいいということはなんとなく分かったのですが、どうも使い方がよくわからなかったので、複数の記事で同じ方法を採っているのを見つけて、大丈夫だと思って実行しました(おい)
ちゃんとドキュメント読んで理解してから実行するのがベストなのですが、ちょっと時間がなかったので横着しました。
以下、コマンドのみまとめ
$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch <ディレクトリorファイル>" --prune-empty -- --all
$ rm -rf .git/refs/original/
$ git reflog expire --expire=now --all
$ git gc --aggressive --prune=now
reflog
や gc
が何をしているのか、よく分かっていませんが、コマンド実行後、.git
の容量が大幅に下がったので、履歴から大容量ファイルの削除に成功したようです。
これで、push
したら上手く行ったので、無事完了です。
この記事は自分用のメモなので、同じ問題に直面している方は、参考元の記事の方を御覧ください。