Gitで履歴も含めてタブ・スペースや改行コードを一括変更する(git-filter-branch)
先週に書いた「Gitでタブ・スペースや改行コードなど体裁を統一する」では設定後のコミットにフィルターが適応される。しかし、すでに履歴を持っているレポジトリーの場合、過去のソースコードの体裁も整えたいと思うときがある。今までは半ばあきらめていたのだが、Gitのリファレンスを眺めていると、今後行うコミットだけではなく、過去の履歴を書き換える手早い方法をみつけた。しかも、意外と簡単である。
まずは、作業用にレポジトリーをクローンする。(いきなり、大切なレポジトリーに対してやらないこと!)
例
git clone my-project work-temp cd work-temp
まずは、ワークツリーのファイルを書き換えるフィルターを用意する。(例としてfilter-source.shとする。)
#!/bin/sh for f in $(find -name \*.php) do mv $f $f.bak \ && cat $f.bak | /usr/local/bin/normalize-text.pl > $f \ && rm $f.bak done
次に、git filter-branchを使って、レポジトリーにフィルターを適応する。
git filter-branch --tree-filter './filter-source.sh' HEAD
git filter-branch はよく使うコマンドだとは思わないが、何か大なたを振るうときにはとても便利そうである。
このコマンドのリファレンス(英語)はこちら
http://www.kernel.org/pub/software/scm/git/docs/v1.7.2.2/git-filter-branch.html