Git内でWinmergeを使用してdiffをファイルする


回答:


113

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

git mergetool winmerge」で詳しく説明されているように、シンプルgit config diff.tool winmergeで十分です。

Git 2.5+(2015年第2四半期)は、Winmergeをdiffまたはmergeツールとして認識しています。


元の回答(2009-2012)

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

最初の部分(winmergeを使用)は、「ビジュアルdiffプログラムで「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年半後):

ファイルごとではなくディレクトリの比較がすぐに利用できるようになります。[ANNOUNCE] Git 1.7.11.rc1を
参照してください。

git difftool」学習「--dir-diffすることができ産卵外部のdiffツールの」オプション2つのディレクトリ階層を比較する 2つの一時ディレクトリを移入した後に一度、代わりにファイルのペア毎に一度外部ツールのインスタンスを実行しているのを

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


ディレクトリスクリプトによる元のdifftool(2009年12月)

セバ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を使用したパワー差分では、1つを選択して内部の違いを調べる前に、違いのあるファイルのリストを確認できます。
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

異なるディレクトリにある同じ名前のファイルを処理するほど堅牢ではありませんが、何が可能かという一般的な考え方を提供します
。1つのWinMergeのみが開き、ファイルのリストに内部的な違いがあります。調べたいものをクリックすると、シンプルでESCすべてのWinMerge-diffセッションが閉じます。


1
gitバージョン1.6.5.1.1367.gcd48でこれを試すと、これらの一時フォルダーにファイルが生成されないようです。問題を探すためのアイデアはありますか?ありがとう!
Art

@Art:これらのデバッグケースでは、スクリプトを簡略化して問題を特定しようとします:1 /スクリプトが7パラメーターで呼び出された場合(git diffの最初のパス、ファイルをコピーする場合)2 /は少なくともコールバックされたスクリプトですの終わりにgit diff
VonC、2010

1
@Erik:オプション-ubについては、WinMerge FAQを参照してください。これは次と同じです-u:ファイルをMRUに追加しないようにWinMergeに指示します。
VonC、2011年

1
@Erik:' ' ではなく、c:\Temp\GitDiff\oldとのファイルの比較が表示されます。このDOSプログラムをDOSセッション(bashセッションではない)から実行してよろしいですか?c:\Temp\GitDiff\new/tmp
VonC 2010年

1
@coffeemakrそれは評価されませんでした""実行(私の場合はgit configWindowsのCMDからのコマンドをしかし、あなたは正しいです:それは、と評価されてしまうからです""。bashシェルから実行された場合
VonC

19

最初のパーツを2か所で使用するときに問題が発生し、次のように修正しました

  1. winmerge.cmdを設定するための2番目のコマンドは、cmdlineで追加のスラッシュを必要としました($ LOCALおよび$ REMOTEの前)、それ以外の場合、cygwinはcmdlineの変数を置き換えていました

    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")"
    

3
私はVonCの指示どおりに実行しましたが、winmerge.shスクリプトで空の引数を受け取りました。余分なスラッシュを使用して問題を解決しました。ありがとうございました!
ashagi

6

スレッドが混乱して二股になっているので、msysgit Git Windowsのディレクトリリスト「--dir-diff」WinMergeメソッドの統合手順を次に示します。

手順1-パスにアクセスできる場所(/home/bin/winmerge.shなど)にwinmerge.shという名前のファイルを作成し、次の内容を含めます。

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

ステップ2 -Git Bashに次のコマンドを入力して、winmerge.shをdifftoolとして使用するようにgitに指示します(これらのオプションは/home/.gitconfigに保存されます)。

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

ステップ3 -Git Bashで次のコマンドを入力してWinMergeの差分を開始することでテストできます。

git difftool --dir-diff

手順4-すばやくアクセスするには、この行をホームフォルダーの.bashrcに追加して、このコマンドのエイリアスを作成します(ファイルがまだ存在しない場合は、この行で.bashrcファイルを作成します)。

alias diffdir='git difftool --dir-diff'

ステップ5 -Git Bashに次のコマンドを入力するだけで、WinMergeで差分をすばやく確認できます

diffdir

誰かがの意味を説明しておくと便利だろう$LOCAL$REMOTE
Tola Odejayi 16

6

別の.shファイルの存在を必要としない適切なパラメーターを使用して、Git構成のDiffおよびMergeツールを設定するスクリプトがあります。私には問題なく動いているようです。

git config --global diff.tool winmerge
git config --global difftool.prompt false
git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""

git config --global merge.tool winmerge
git config --global mergetool.prompt false
git config --global mergetool.winmerge.trustExitCode true
git config --global mergetool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""

-パラメータが.gitconfigに適切にリストされるように、.cmd部分全体が引用されています


1
次のコマンドは機能しませんでした。 git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\"" 注:このコマンドは、Powershellからではなく、コマンドプロンプトから実行する必要があります。手動で.gitconfig [difftool "winmerge"]セクションに以下を追加するとうまくいきました: cmd = 'C:/Program Files (x86)/WinMerge/WinMergeU.exe' -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\"
Josh

1
動作しませんでしたが、いくつかの変更により動作しますgit config --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""。管理者としてcmdを開き、次を実行します。正しくないエスケープ文字列がいくつかありました(直前に追加の不要なバックスラッシュがいくつかあることに注意してください$- エスケープ$する必要はないと思います)。また、それは"後に終わりがありませんでしたWinMergeU?.exegit config --get mergetool.winmerge.cmd実際に設定されたものを確認するために実行します。とにかく、非.shバージョンをありがとう:+1!
ファルサレラ2015年

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

また、に注意を払う前方コマンドパスにスラッシュの代わりにバックスラッシュ。
wisbucky 2016年

5

構成なし:

git difftool --tool winmerge

仮定:

  • Winmergeがインストールされている
  • 「gitバージョン2.12.0.windows1」以降のGit for windowsがインストールされています(以前のバージョンのgitではコマンドが導入されている場合があります)。

おかげで、これは最も簡単な解決策である
code4j

2

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

以来git diff、各ファイルに対して一度ずつ指定コマンドを実行するように見える、私は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で)%LOCALAPPDATA%\Temp\1\(Windowsで)にマップされているため、WinMergeへの呼び出しで後者を使用している理由です。


2
私は変更gitprepdiff.shのために#!/bin/sh #echo ...gitprepdiff.sh mkdir -vp "$TMP/GitDiff/old/$(dirname $2)" cp -v $1 "$TMP/GitDiff/old/$2" cp -v --parents $2 "$TMP/GitDiff/new"ありがとうございました!
dobau 2013年

これを機能させるために非常に多くのフープをジャンプするのはばかげているように見えますが、実際はそうです。すべてのファイルの差分を一度に取得できます。サブディレクトリ内のファイルを適切に処理するために、@ dobauによって言及された変更も行う必要がありました。
トム

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のコマンド・ライン・マニュアル:「パラメータがいずれかのスラッシュ(/)またはダッシュが付いている( - )文字」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.