こたつとみかんとプログラミング

33才実務未経験ですがウェブエンジニアにジョブチェンジするために勉強したことをアップするためのブログです。

git に保存された履歴をなかったことにする

1人で開発していると、レビューしてくれる人がいないわけで、railstutorial にあるように自分でブランチをマスターに merge してmaster を push しているのだが、git のリポジトリには容量があることが判明。push 失敗。原因は、サンプルアプリの機能の一つとしてPDF出力を作ろうとして追加した wicked_pdf と wkhtmltopdf-binary の gem のせいだった。これがめちゃ重くて、さらに libXrender などソフトをさらに追加しなければいけないようだったので docker でやろうと思い(docker でできるのかな??)、gem をインストールしたまま commit, merge, push までしてしまった。

merge と commit を取り消してローカルで gem に関連するファイルをすべて消去して再度挑戦。できない。調べたら、ローカルでファイルを消したからって git には履歴として残ってしまうということだった。

git に保存された履歴をなかったことにする

$ git filter-branch --tree-filter "rm -f [消したいファイルパス]" HEAD
$ git filter-branch --tree-filter "rm -f -r [消したいディレクトリパス] " HEAD
filter-branch

歴史の書き換えができる。最強のオプションと称され、大量のコミットの書き換えを機械的に行いたい場合に使う。

--tree-filter と --index-filter について

すべてのスナップショットから指定したファイル・ディレクトリを消去するには --tree-filter
ワークツリーにファイルを残したい場合は --index-filter を使う。

スナップショットとは

ファイルの変更履歴を管理する仕組み。変更されたファイルの差分のみを記録するのではなく、git が管理するすべてのファイル情報を記録すること。変更されていないファイルはそのまま記録せず、代わりに以前のバージョンを参照する情報を記録する。


全部の関連ファイルを履歴から削除して push したら、めちゃ早く push できた。
それにしてもPDF機能、どうしようかな。wicked_pdf と wkhtmltopdf-binary のファイルが重い場合の対処法を調べてみたけれどほとんどなかった。とりあえず CSV 出力機能だけつけて、一旦諦める。

参考にした記事
git filter-branch とは? - Qiita
Ubuntu Git その4 - スナップショットとは・データはチェックサムで管理される - kledgeb