svn diffで-wオプションを使う

こんにちは。hnwです。カレー部の部員が3日連続で同じカレー屋に行ったそうです。いくらカレーが好きでも限度があるだろう、と思いますね。私は常識人なので、せいぜい月・水・金と同じ店には1日おきにしか行きません(以上全て実話です)。

さて、今回はsvnコマンドの話題です。バージョン管理といえば昔はCVSで決まりでしたが、最近はSubversionが流行ですよね。この2、3年でCVSからSubversionに移行した方も多いのではないでしょうか。ディノでも2年ほど前に、それまでCVS管理していた全リポジトリをSubversionに移行しました。

Tracの導入やHTTPS+basic認証+クライアント証明書によるアカウント管理の導入など、移行についてはメリットの方が大きかったのですが、多少の戸惑いもありました。中でも私が一番精神的にダメージを受けたのは、私がcommitの前に必ず打つコマンド「cvs diff -w」の-wオプションがsvn diffコマンドでは利用できなかったことです。

念のため補足しておきますが、-wは空白文字列の個数の違いを無視して同一視するオプションです。複数人で開発しているとインデントがおかしい人が混ざっていてインデントを修正することがあるのですが、インデント修正にはたいした意味はありません。diffを取るときには意味のある変更箇所を確認したいので、インデント修正した場所は無視したいのです。本当ならプロジェクト内でインデントを統一すべきなのですが…

もっとも、しばらくしてsvn diffでも-wを実現する方法を知りました。そんなこと知ってるよ、という人も多いかと思いますが、移行したばかりで困っている人が私以外にいるかもしれませんので、念のため紹介します。

やり方から先に書きます。まず、$HOME/.subversion/configファイルに以下のように書きます。

[helpers]
diff-cmd = diff

この設定を行った上で「cvs diff -w」と同等のことがしたい場合には「svn diff -x -w」と打てばOKです。残念ながらCVSの頃より3タイプ余計に必要ですが、私は我慢しています。「cvs diff -i -w」と同じことをしたい場合は「svn diff -x "-i -w"」とする必要があります。非常に残念ですが、5タイプも余計に増えてしまいました。タイプ数が増えることについて私より忍耐力が無い場合にはwrapperを書くしか無いと思います。

少し解説をします。Subversionは差分を取る機能を内蔵しており、svn diffなどの際も外部のコマンドを呼び出すことはありません。その代わりというわけではありませんが、本物のdiffコマンドが持つオプションの大半は実装されていません。

configファイルのdiff-cmdの設定は、外部のdiffコマンドを利用する場合に、どのdiffを使うかを指定するものです。これは「--diff-cmd」オプションでも指定できます。また、「-x」オプションを指定することで、(diff-cmdが指定してあれば)内蔵diffの代わりに外部コマンドのdiffで差分が出力されます。さらに、「-x」の次の引数がオプション指定として外部コマンドのdiffに渡されます。

そんなわけで、機能としてはCVSの頃と同じことができるはずです。もし今まで知らないで悲しんでいる人がいたら、これで多少「svn diff」への不満が解消したのではないでしょうか。

ここまで書いてきて気づいたのですが、内蔵のdiffも機能が徐々に上がっているようで、手元のSubversion 1.4.5では内蔵diffでも-bと-wオプションは使えるようですね。昔はdiff-cmdの設定が必須だったのですが、「-w」に限って言えば不要になったようです。他のオプションが欲しくなる可能性を考えると、diff-cmdを設定しておく方が良い気がしますけど。

コメント / トラックバック 1 件

#1 [Linux][Debian][Subversion] colordiff で svn diffを見やすくする - [ま]技術雑記 2008/10/10 20:46

[...] svn diffで-wオプションを使う [...]

コメントする