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