Windowsのコマンドライン版Subversion(SVN)の外部DIFFツールにWinMergeを設定したが上手くいかなかった

WinMergeをSubversionのdiffとして使用する – てんぷらメモの方法でSubversionの外部DIFFツールにWinMergeを設定したけど上手くいかなかった。WinMergeに渡される比較用の一時ファイル(tmpfile.tmp)が存在しない為にWinMergeのファイル選択のダイアログが表示されてしまう。

色々と検索ワードを変えて調べてみたが解決せず。ふと”subversion diff tempfile.tmp”で検索したらドンピシャリ。Subversion r12がヒット。2ちゃんねるの過去ログでしょうか。

138デフォルトの名無しさんsage2009/12/02(水) 01:52:09

ttp://terai.xrea.jp/Subversion/WinMerge.html

このページを参考にWinMergeをSubversionのdiffとして使用する設定を行ったのですが

svn diff test.txt

はうまくいきますが

svn diff -r 100 test.txt

はWinMergeのファイル指定のダイアログが表示されうまくいきません。

どうもリビジョン100のファイルが取得できないようです。

どなたか原因がわかる方いらっしゃいませんか?

140デフォルトの名無しさんsage2009/12/02(水) 02:25:53

svn diff -r 100 test.txt .

じゃないの?

143デフォルトの名無しさんsage2009/12/02(水) 23:04:26

>>140

ダメでした。

“svn diff -r 100:101 test.txt”もダメです。

コマンドラインでは成功します。

ただ最新版がr102の場合、

“svn diff -r 102 test.txt”なら成功します。

ルーターのLEDが点滅しているので取りにはいっているようです。

考えられる原因は「OSがVista、ノートンを使っている」くらいでしょうか。

144デフォルトの名無しさんsage2009/12/03(木) 10:10:05

それぞれのバージョンは?

145デフォルトの名無しさんsage2009/12/03(木) 23:00:08

>>144

バッチファイルの

START “WinMerge” /B

を削除するとうまくいきました。

どうもこれがあると比較用のtempfile.tmpが消えてしまうようです。

ちなみにsvnクライアントのバージョンは1.6.6です。

サーバーはわかりません。

138さんは神ですね。

手順をまとめると…

以下のようなバッチファイルを作成して、そのパスを%APPDATA%\Subversion\configファイルのhelpersセクション→diff-cmdキーに設定する。

@ECHO OFF

[WinMergeU.exeのパス] /e /s /ub /dl %3 /dr %5 %6 %7

というわけでした。

6 thoughts on “Windowsのコマンドライン版Subversion(SVN)の外部DIFFツールにWinMergeを設定したが上手くいかなかった”

  1. こちらでは初めまして。
    某中学校(隠す気ないw)でカキコしている葉月です。

    てんぷらさんのメモは――
    EclipseでJavaしていた頃、よくお世話になっていました。
    Swing系のマニアックアプリの宝庫なのは知っていましたが、
    まさかWinMargeを使ったテクニックまで載せていたとは!

    今も作業してまして、デバックのローカルウィンドウに表示
    されているコレクションクラスの中身を駄ツールで解析して
    CSVファイルに出力した後、部分的にWinMargeで比較してい
    ます。

    WinMargeがあると自分で作る気力は起きませんが――
    .NET系にあるListクラスのFindIdメソッドを使って、diff系のソフトを作るのに役立つこと
    に気づきました。
    (似たような機能のあるクラスは作りました)

    あにすさんなら、もっと効率のいいやり方を知ってそうですね。
    暇していたもので長々と失礼しました。

  2. そんな大それた代物じゃないですよ。
    アルゴリズムなんて言葉は――
    あにすさんぐらいのレベルが使っていい言葉で、
    私には10年早いです(笑)

    経緯を説明します。
    元々、あるサイトを見るのがめんどいのでクローラを作りました。
    私の待ち時間とクローラするサイトの負担を減らしたかったので、
    そのサイトでクローラしたID(履歴ID)を保存し、
    次回にクローラするID(今回取得したID)と比較したくなりました。
    その時にFindIndexメソッドのことを知りました。
    ここから改造は必要ですが、
    あにすさんがやっていることに比べれば、
    かなりレベルは落ちますね。

    >>データ(List)の中身

    >今回取得したID
    171300
    171301
    171302
    109134 ←ここから先は見ている
    110129
    138366
    126098
    171299

    >履歴ID
    109134
    110129
    138366
    126098
    171299
    171295
    171294
    171293
    171292
    171291

    >>イメージの部分的なサンプルです。

    private void Hoge
    {
    int iVal = 0;

    for (int i = 0; i < this.今回取得したID.Length; i++)
    {
    iVal = this.今回取得したID.FindIndex(値, this.IsIdCheck);
    Console.WriteLine(iVal);
    //↑3、4、5、6、7を表示
    }
    }

    private bool IsIdCheck(string strId)
    {
    if (this.履歴ID.Contains(strId))
    {
    return true;
    }

    return false;
    }

  3. すいません、サンプルを間違えました。

    >誤
    iVal = this.今回取得したID.FindIndex(値, this.IsIdCheck);

    >正
    iVal = this.今回取得したID.FindIndex(i, this.IsIdCheck);

  4. >葉月さん
    ちょっと遊んでみました。

    foreach (var id in from id in 今回取得したID
              where 履歴ID.Contains(id)
              select 今回取得したID.IndexOf(id)) {
      Console.WriteLine(id);
    }

    用途に合うかわかりませんが、こんなソフトもありますよ。

    DiffBrowser ~ ウェブページの更新内容取得ソフト
    http://www010.upp.so-net.ne.jp/suede/diffbrowser.html

  5. さすが、あにすさんです!
    Linqで照合するやり方は、思いつきませんでした。
    idを別にコレクションや配列で受ければ、
    用途に合いそうですね。
    次回はDiffソフトでいきますか?(笑)
    ↑念のため冗談です。

    >DiffBrowser ~ ウェブページの更新内容取得ソフト
    ご紹介ありがとうございます。こんなソフトあるんですね。
    今回の用途には使えませんが、他で使う機会はありそうです。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。