106

git 内で Winmerge を使用して Diff を実行する方法はありますか?

4

9 に答える 9

123

6 年後の 2015 年 6 月の更新:

git mergetool winmerge」で詳しく説明されているように、単純なgit config diff.tool winmergeもので十分です。

Git 2.5+ (2015 年第 2 四半期) では、Winmerge が差分またはマージ ツールとして認識されるようになりました。


元の回答 (2009-2012)

(msysgit、1.6.5、DOS セッション)

最初の部分 (winmerge を使用) は、「ビジュアル差分プログラムで 'git diff' 出力を表示するにはどうすればよいですか?」で説明されています。

C:\myGitRepo>git config --replace --global diff.tool winmerge
C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --replace --global difftool.prompt false

winmerge.shのディレクトリ部分に保存されている場合PATH:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -u -dl "Local" -dr "Remote" "$1" "$2"

( WinMerge コマンドライン オプションを参照)

git difftool

WinMerge を起動します。WinMerge を起動し
たい場合は、以下を設定するだけです:git diff

set GIT_EXTERNAL_DIFF=winmerge.sh

しかし、実際の付加価値は、同じ差分ツールを使用して、すべての差分を順番に表示するのではなく、1 つのバッチで表示できるため、一度に 1 つのファイルごとに差分ツール ウィンドウを閉じる必要があります。

2012 年 6 月の更新(2 年半後):

ファイルごとの代わりにディレクトリを比較できるようになる予定です: [アナウンス] Git 1.7.11.rc1
を参照してください:

は、ファイル ペアごとに 1 回外部ツールのインスタンスを実行する代わりに、2 つの一時ディレクトリにデータを入力した後、一度に2 つのディレクトリ階層を比較できる外部差分ツールを生成するオプションをgit difftool学習しました。--dir-diff

詳細については、「パッチ:ディレクトリの差分を処理する方法をdifftool教えるdifftool」と、「 Git ブランチのディレクトリ比較」の回答を参照してください。


ディレクトリ スクリプトによるオリジナルの difftool (2009 年 12 月)

Seba Illingworthが彼の答えで言及しているように、スクリプト git-diffall.sh (これもパスに入れられます) はまさにそれを行うことができます:

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

ただし、それはn 個のファイルに対して nのウィンドウを開くことによってのみ機能します (WinMerge のオプションを使用しようとすると、difftool によって一時ファイルが削除されるのが早すぎるため機能しません)。-s


そのため、私はGitDiff.batのアプローチを気に入っています - GI を使用した電力差分。これにより、ファイルを選択して内部の違いを調べる前に、違いのあるファイルのリストを確認できます。
DOSコマンドのみを使用するように調整しました

@echo off

setlocal

if "%1" == "-?" (
    echo GitDiff - enables diffing of file lists, instead of having to serially
    echo diff files without being able to go back to a previous file.
    echo Command-line options are passed through to git diff.
    echo If GIT_FOLDER_DIFF is set, it is used to diff the file lists. Default is windff.
    goto END
)

if "%GIT_DIFF_COPY_FILES%"=="" (
    rd /s /q %TEMP%\GitDiff
    mkdir %TEMP%\GitDiff
    mkdir %TEMP%\GitDiff\old
    mkdir %TEMP%\GitDiff\new

    REM This batch file will be called by git diff. This env var indicates whether it is
    REM being called directly, or inside git diff
    set GIT_DIFF_COPY_FILES=1

    set GIT_DIFF_OLD_FILES=%TEMP%\GitDiff\old
    set GIT_DIFF_NEW_FILES=%TEMP%\GitDiff\new

    set GIT_EXTERNAL_DIFF=%~dp0\GitDiff.bat
    echo Please wait and press q when you see "(END)" printed in reverse color...
    call git diff %*

    if defined GIT_FOLDER_DIFF (
        REM This command using GIT_FOLDER_DIFF just does not work for some reason.
        %GIT_FOLDER_DIFF% %TEMP%\GitDiff\old %TEMP%\GitDiff\new
        goto END
    )

    if exist "%ProgramFiles%\Beyond Compare 2\BC2.exe" (
        set GIT_FOLDER_DIFF="%ProgramFiles%\Beyond Compare 2\BC2.exe"
        "%ProgramFiles%\Beyond Compare 2\BC2.exe" %TEMP%\GitDiff\old %TEMP%\GitDiff\new
        goto END
    )

    "%ProgramFiles(x86)%\WinMerge\WinMergeU.exe" -r -e -dl "Local" -dr "Remote"  %TEMP%\GitDiff\old %TEMP%\GitDiff\new
    goto END
)

REM diff is called by git with 7 parameters:
REM     path old-file old-hex old-mode new-file new-hex new-mode
copy %TEMP%\%~nx2 %GIT_DIFF_OLD_FILES%\%1
copy %5 %GIT_DIFF_NEW_FILES%

:END

異なるディレクトリにある同じ名前のファイルを処理するには十分に堅牢ではありませんが、可能なことの一般的なアイデアを提供します
。調べたいものをクリックすると、簡単にすべてのセッションESCが閉じます。WinMerge-diff

于 2009-12-10T22:25:33.273 に答える
20

最初の部分を 2 か所使用すると問題が発生し、次のように修正しました

  1. winmerge.cmd をセットアップするための 2 番目のコマンドでは、コマンドライン ($LOCAL と $REMOTE の前) に追加のスラッシュが必要でした。それ以外の場合、cygwin はコマンドラインの変数を置き換えていました。

    C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""
    
  2. winmerge.sh ファイルを次のように変更しました (これがないと、right-path-invalid エラーが発生していました)

    #!/bin/sh
    echo Launching WinMergeU.exe: "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
    "$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
    
于 2011-10-10T04:57:04.893 に答える
5

Windowsでは、次の方法で実行できます。

1) .gitconfig ファイルを開きます。これはホーム ディレクトリにあります: c:\users\username.gitconfig

2) 以下の行を追加します。winmerge へのパスを一重引用符で囲んでいることに注意してください。

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e "$LOCAL" "$REMOTE"
[difftool]
    prompt = false
[merge]
    tool = winmerge
[mergetool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" \"$MERGED\" \"$REMOTE\"
[mergetool]
    keepBackup = false
    trustExitCode = false
于 2015-06-03T08:39:22.673 に答える
2

私のGitインストールにはbashシェルが付属していたため、ソリューションがDOSバッチファイルとして提示された理由について混乱しました。また、bash から DOS コンテキストを実行することもできなかったので、以前に bash コンテキストで共有されていたものを適応させようとしました。

git diffファイルごとに指定されたコマンドを 1 回実行するように見えるため、ソリューションを 2 つの bash スクリプトに分割しました。

最初に、gitprepdiff.sh前述のように difftool になるように構成します

#!/bin/sh
#echo ...gitprepdiff.sh
cp -v $1 "$TMP/GitDiff/old/$2"
cp -v $2 "$TMP/GitDiff/new"

また、コマンドの結果をgit configure直接見つけて編集できることにも注意しましたC:\Users\<username>\.gitconfigure

gitdiff.sh次に、通常呼び出すコマンドラインで実行されますgit diff

#!/bin/sh
#echo Running gitdiff.sh...

DIFFTEMP=$TMP/GitDiff

echo Deleting and re-creating $DIFFTEMP...
rm -rf $DIFFTEMP;
mkdir $DIFFTEMP;

echo Creating $DIFFTEMP/old...
mkdir $DIFFTEMP/old;

echo Creating $DIFFTEMP/new...
mkdir $DIFFTEMP/new;

git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename";
done

"$PROGRAMFILES\WinMerge\WinMergeU.exe" -r -e -dl "Repository" -dr "Working" $LOCALAPPDATA\\Temp\\1\\GitDiff\\old $LOCALAPPDATA\\Temp\\1\\GitDiff\\new

/tmpまた、私のインストールでは(bash で) が (Windows で) マッピングされていることも注目に値します。%LOCALAPPDATA%\Temp\1\そのため、WinMerge への呼び出しで後者を使用しています。

于 2011-11-24T00:59:36.123 に答える
1
git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "\"$PROGRAMFILES\\WinMerge\\WinMergeU.exe\" -u -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""
git config --global difftool.prompt false

WinMerge コマンド ライン マニュアルによると、「パラメータには、スラッシュ ( / ) またはダッシュ ( - ) 文字のいずれかがプレフィックスとして付けられます」

于 2016-03-17T01:09:52.440 に答える