• 追加された行はこの色です。
  • 削除された行はこの色です。
  • Subversion/WinMerge へ行く。

---
title: WinMergeをSubversionのdiffとして使用する
keywords: [Subversion, Diff, WinMerge]
author: aterai
pubdate: 2008-07-01T17:45:52+09:00
description: Windows環境のSubversionで、差分の比較(diff)にWinMergeを使用する方法について記述しています。
---
#contents

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

#ref(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQr22Z_HNOI/AAAAAAAAArY/KMybO9YLyow/s800/winmerge.png)

* インストール [#j91a5a73]
どちらも特に設定は必要ありません。[http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html WinMerge 日本語版]などからダウンロードしてインストールするだけです。ここではそれぞれ以下のバージョンを利用しています。
- svn 1.4.2 (r22196)
- WinMerge-2.7.4.0-jp-2

* コマンドライン [#c18b151c]
コマンドラインから使用する場合は、以下の例のようにオプションを指定します。
 svn diff Example.java -r PREV:HEAD --diff-cmd="C:\Program Files\WinMerge\WinMerge.exe" -x "/dl /dr"

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

- ''winmerge.bat'' ファイル
-- [http://svnbook.red-bean.com/en/1.2/svn.advanced.externaldifftools.html#svn.advanced.externaldifftools.diff.ex-2 Using External Differencing Tools]
-- 使用例: `svn diff Example.java -r PREV:HEAD --diff-cmd=winmerge.bat`

#code{{
@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"
REM SET DIFF="C:\Program Files (x86)\WinMerge\WinMergeU.exe"
SET DIFF=%PROGRAMFILES%\WinMerge\WinMergeU.exe

REM Subversion provides the paths we need as the sixth and seventh 
REM parameters.
REM SET LEFT=%6
REM SET RIGHT=%7
for /f "USEBACKQ TOKENS=*" %%i in (`cygpath -m "%6"`) do @set LEFT=%%i
for /f "USEBACKQ TOKENS=*" %%i in (`cygpath -m "%7"`) do @set RIGHT=%%i

echo %LEFT%
echo %RIGHT%

REM Call the diff command (change the following line to make sense for
REM your merge program).
REM %DIFF% --left %LEFT% --right %RIGHT%
REM STARTはcmd.exeの組み込みコマンドなので注意
START "WinMerge" /B "%DIFF%" /e /s /ub /dl %3 /dr %5 "%LEFT%" "%RIGHT%"

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`

#code{{
#!/bin/sh
LEFT=`cygpath -m "$6"`
RIGHT=`cygpath -m "$7"`
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -s -ub -dl "$3" -dr "$5" "$LEFT" "$RIGHT"
}}

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

#code{{
[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が立ち上がります((%%ただし、うっかり大量のファイルを比較してしまうと、一つずつ順番にWinMergeが立ち上がるので注意が必要%%))。
 svn diff Example.java -r PREV:HEAD

* 参考リンク [#z313e92f]
- [http://www.geocities.co.jp/SiliconValley-SanJose/8165/winmerge.html WinMerge 日本語版]
- [http://winmerge.org/2.6/manual/CommandLine.html 16. Command Line]
- [http://svnbook.red-bean.com/en/1.2/svn.advanced.externaldifftools.html#svn.advanced.externaldifftools.diff.ex-2 Using External Differencing Tools]
- [http://flimflan.com/blog/UsingWinMergeWithSubversion.aspx Joshua Flanagan - Using WinMerge with Subversion]
-- [http://itpro.nikkeibp.co.jp/free/NT/WinKeyWord/20040805/1/start.shtml Windowsコマンド集:(start)]
-- [http://winmerge.org/2.6/manual/CommandLine.html 16. Command Line]

* コメント [#s74a5720]
#comment
- [http://flimflan.com/blog/UsingWinMergeWithSubversion.aspx Joshua Flanagan - Using WinMerge with Subversion]を参考にしてバッチファイルを変更(比較を一つのWinMergeで開くように)しました。 -- &user(aterai); &new{2008-07-01 (火) 17:46:39};
- winmerge.bat のコメントに日本語があると、このページでうまく表示できていなかったのを修正。 -- &user(aterai); &new{2008-12-15 (月) 20:36:03};
- Subversion 1.6.11にて、WinMergeをSTARTコマンドで実行すると比較用の一時ファイルが消えてしまい、WinMergeでの比較が出来ませんでした。バッチファイルの『START "WinMerge" /B 』の部分を削除することで正常に起動されるようになりました。 -- &user(anis774); &new{2010-05-04 (火) 06:00:00};
-- 報告ありがとうございます。この場合、WinMergeのオプション(編集、設定、バックアップファイル、作成するバックアップ:で、フォルダ比較のチェック)を外すと、STARTコマンドを使ってもうまくいくかもしれません。 -- &user(aterai); &new{2010-05-04 (火) 15:56:11};
- 上記の設定項目を変更してもSTARTコマンドを使った比較は出来ませんでした。比較用に生成された一時ファイルを観察してみたのですが、SVN側で起動したプロセスの終了を検知して比較用の一時ファイルを消しているようです。STARTコマンドを使用すると、STARTコマンドのプロセスがすぐに終了してしまう為、WinMerge起動時には既にファイルが削除された状態になります。 -- &user(anis774); &new{2010-05-23 (日) 03:06:12};
-- どうも何かanis774さんと自分の設定か環境が違うのかもしれないですね。なんとなくですが、「STARTコマンドのプロセスがすぐに終了してしまう」ということなら、参照元の[http://flimflan.com/blog/UsingWinMergeWithSubversion.aspx Joshua Flanagan - Using WinMerge with Subversion]みたいに、STARTコマンドに/WAITを付けるとよさげ?な感じがします。 -- &user(aterai); &new{2010-05-24 (月) 15:08:22};
- /WAITオプションを付加して試してみたのですが、これだとSTARTコマンド無しのときと同じ動作になります。一時ファイルが消える前にどこかにコピーして、コピーしたファイルでWinMergeを開き、終了後に削除する処理を書く必要がありそうです。 -- &user(anis774); &new{2010-05-26 (水) 08:37:49};

#comment