web-dev-qa-db-ja.com

Git内でWinmergeを使用して差分をファイルします

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

97
eiu165

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

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

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

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

git difftool

これでWinMergeが起動します。
git diffでWinMergeを起動するには、次を設定します。

set GIT_EXTERNAL_DIFF=winmerge.sh

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

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

ファイルごとの代わりにディレクトリを比較することは間もなく利用可能になります:
[ANNOUNCE] Git 1.7.11.rc1 を参照してください。

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

パッチdifftool:ディレクトリdiffを処理するdifftoolを教える」および「- Gitブランチのディレクトリ比較 "詳細については。


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

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

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

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


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

異なるディレクトリにある同じ名前のファイルを処理するのに十分な堅牢性はありませんが、何が可能かについての一般的なアイデアを提供します。
ここでは、1つのWinMergeのみが開き、内部の違いがあるファイルのリストが表示されます。調べたいものをクリックしてから、簡単な ESC すべてのWinMerge-diffセッションを閉じます。

112
VonC

最初の部分を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")"
    
19
Gopi

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

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部分全体が引用されます

6
Alf47

スレッドは混乱して分岐しているため、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-gittoolとしてwinmerge.shを使用するようgitに指示するために、Git Bashに次のコマンドを入力します(これらのオプションは/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

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

git difftool --dir-diff

ステップ4-より迅速にアクセスするには、ホームフォルダーの.bashrcにこの行を追加して、このコマンドのエイリアスを作成します(または、ファイルが存在しない場合は、この行で.bashrcファイルを作成します):

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

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

diffdir
6
robertcollier4

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
3
Caner

設定なし:

git difftool --tool winmerge

仮定:

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

私の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)が%LOCALAPPDATA%\Temp\1\(Windows)にマッピングされるため、WinMergeの呼び出しで後者を使用していることです。

2
Shawn South
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コマンドラインマニュアル :「パラメータには、スラッシュ(/)またはダッシュ(-)文字がプレフィックスとして付けられます」

1
Steve Lang