TITLE:WinMergeをSubversionのdiffとして使用する

WinMergeをSubversionのdiffとして使用する

#adsense2

編集者:Terai Atsuhiro
作成日:2008-07-01
更新日:2014-09-26 (金) 19:07:04

概要

このページでは、Windows環境のSubversionで、差分の比較(diff)に、WinMergeを使用する方法をメモしています。

winmerge.png

インストール

どちらも特に設定は必要ありません。WinMerge 日本語版などからダウンロードしてインストールするだけです。ここではそれぞれ以下のバージョンを利用しています。

  • svn 1.4.2 (r22196)
  • WinMerge-2.7.4.0-jp-2

コマンドライン

コマンドラインから使用する場合は、以下の例のようにオプションを指定します。

svn diff Example.java -r PREV:HEAD --diff-cmd="C:\Program Files\WinMerge\WinMerge.exe" -x "/dl /dr"

バッチファイルを使って、入力を短くしてみます。以下は、パスの通った場所にwinmerge.batを作成して使用する例になっています。

@ECHO OFF
SETLOCAL
REM Configure your favorite diff program here.
REM SET DIFF="C:\Program Files\Funky Stuff\My Diff Tool.exe"
REM SET DIFF="C:\Program Files\WinMerge\WinMergeU.exe"
SET DIFF="%PROGRAMFILES%\WinMerge\WinMergeU.exe"

REM Subversion provides the paths we need as the sixth and seventh
REM parameters.
SET LEFT=%6
SET RIGHT=%7

REM cygwin 空白があると駄目
REM for /f "USEBACKQ TOKENS=*" %%i in ('cygpath -m "%6"') do @set LEFT=%%i
REM for /f "USEBACKQ TOKENS=*" %%i in ('cygpath -m "%7"') do @set RIGHT=%%i

REM Call the diff command (change the following line to make sense for
REM your merge program).
REM %DIFF% --left %LEFT% --right %RIGHT%
START "WinMerge" /B %DIFF% /e /s /ub --left "%LEFT%" --right "%RIGHT%" /dl %3 /dr %5

REM Return an errorcode of 0 if no differences were detected, 1 if some were.
REM Any other errorcode will be treated as fatal.
  • winmerge.sh ファイル
    • `cygwin版のsvn.exeを使用するなら、cygpath`でパスを変換しておく
    • 使用例: `svn diff --diff-cmd=winmerge.sh`
#!/bin/sh
LEFT='cygpath -m "$6"'
RIGHT='cygpath -m "$7"'
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -s -ub -dl "$3" -dr "$5" "$LEFT" "$RIGHT"

config ファイル

C:\Documents and Settings\ユーザ名\Application Data\Subversion\config ファイルに、diff-cmdオプションを追加して先に作成したバッチファイルを指定しています。

[helpers]
### Set diff-cmd to the absolute path of your 'diff' program.
###   This will override the compile-time default, which is to use
###   Subversion's internal diff implementation.
# diff-cmd = diff_program (diff, gdiff, etc.)
diff-cmd = winmerge.bat

コマンドラインなどで、diff-cmdオプションを指定しなくても、WinMergeが立ち上がります*1

svn diff Example.java -r PREV:HEAD

参考リンク

コメント

  • Joshua Flanagan - Using WinMerge with Subversionを参考にしてバッチファイルを変更(比較を一つのWinMergeで開くように)しました。 -- aterai
  • winmerge.bat のコメントに日本語があると、このページでうまく表示できていなかったのを修正。 -- aterai
  • Subversion 1.6.11にて、WinMergeをSTARTコマンドで実行すると比較用の一時ファイルが消えてしまい、WinMergeでの比較が出来ませんでした。バッチファイルの『START "WinMerge" /B 』の部分を削除することで正常に起動されるようになりました。 -- anis774
    • 報告ありがとうございます。この場合、WinMergeのオプション(編集、設定、バックアップファイル、作成するバックアップ:で、フォルダ比較のチェック)を外すと、STARTコマンドを使ってもうまくいくかもしれません。 -- aterai
  • 上記の設定項目を変更してもSTARTコマンドを使った比較は出来ませんでした。比較用に生成された一時ファイルを観察してみたのですが、SVN側で起動したプロセスの終了を検知して比較用の一時ファイルを消しているようです。STARTコマンドを使用すると、STARTコマンドのプロセスがすぐに終了してしまう為、WinMerge起動時には既にファイルが削除された状態になります。 -- anis774
    • どうも何かanis774さんと自分の設定か環境が違うのかもしれないですね。なんとなくですが、「STARTコマンドのプロセスがすぐに終了してしまう」ということなら、参照元のJoshua Flanagan - Using WinMerge with Subversionみたいに、STARTコマンドに/WAITを付けるとよさげ?な感じがします。 -- aterai
  • /WAITオプションを付加して試してみたのですが、これだとSTARTコマンド無しのときと同じ動作になります。一時ファイルが消える前にどこかにコピーして、コピーしたファイルでWinMergeを開き、終了後に削除する処理を書く必要がありそうです。 -- anis774