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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください