git 内で Winmerge を使用して Diff を実行する方法はありますか?
9 に答える
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
最初の部分を 2 か所使用すると問題が発生し、次のように修正しました
winmerge.cmd をセットアップするための 2 番目のコマンドでは、コマンドライン ($LOCAL と $REMOTE の前) に追加のスラッシュが必要でした。それ以外の場合、cygwin はコマンドラインの変数を置き換えていました。
C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""
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")"
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
私の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 への呼び出しで後者を使用しています。
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 コマンド ライン マニュアルによると、「パラメータには、スラッシュ ( / ) またはダッシュ ( - ) 文字のいずれかがプレフィックスとして付けられます」