GitやSvnなどの差分ファイル抽出決定版

せっかくソースコードのバージョン管理をしているのに、納品物が「前回との差分ファイル」だったりすることありますよね。たしかに変更ファイルはこんなコマンドで、こういうふうに出せます。

$ git diff --name-status HEAD~1
M    foo/bar.html
A    foo/baz.html
...

が、このとき差分がいろんなディレクトリに分散していると、選んで取り出すのが面倒です。

それで以前こんなこと (Subversionで、あるリビジョン以降の差分をファイルで抽出 - なんたらノート 第二期) をしていたのですが、使っているバージョン管理ツールがひとつに固定できなくなってきたし、そもそも差分の取り方も多様なオプションが欲しかった。というわけで書いたのがこれです。

使い方

$ git diff --name-status HEAD~1
M    foo/bar.html
A    foo/baz.html
...

というふうに変更がどうだったかを確認できたら、そのままコマンドラインのヒストリを戻ってちょっと書き足します。

$ git diff --name-status HEAD~1 | export-diff.py ../last-update

おしりにパイプしてコマンドに渡すだけ。すでに確認済みだから変更を画面に出す必要はないだろうけど、慎重な人のために -v (--verbose) オプションもありますよ。詳しくは -h で。

で、これでこんな器用なエクスポートも可能に。(static/cssの中の3つ前と1つ前の差分を出す)

$ git diff --name-status HEAD~3 HEAD~1 -- static/css | export-diff.py ../recent-update-css

とまあ、コマンドラインで指定できるものなら何でもありです。

しかもこのコマンドの便利なところは、これ1個でバージョン管理ツールがなんでもいけること。

$ svn diff -r1234 --summarize ./
M    foo/bar.html
A    foo/baz.html
(よし確認した)
$ svn diff -r1234 --summarize ./ | export-diff.py ../after-r1234


という意味で、これを自分用の決定版ということにしました。svn特化やgit特化はシェルスクリプトレベルで可能ですね。実装も、たいていのLinuxにあり、Windowsでもインストーラが安心のPythonでやってあります。たぶん2.4以上のPythonインタプリタを全部カバーしてると思います。たぶん。