Git内でWinmergeを使用してDiffを実行する方法はありますか?
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 Illingworth が his 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
セッションを閉じます。
最初の部分を2箇所で使用する際に問題が発生したため、次のように修正しました
Winmerge.cmdをセットアップするための2番目のコマンドでは、cmdlineに余分なスラッシュが必要でした($ LOCALおよび$ REMOTEの前)。それ以外の場合、cygwinはcmdlineの変数を置き換えました
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")"
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部分全体が引用されます
スレッドは混乱して分岐しているため、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
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 difftool --tool winmerge
仮定:
私の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の呼び出しで後者を使用していることです。
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コマンドラインマニュアル :「パラメータには、スラッシュ(/)またはダッシュ(-)文字がプレフィックスとして付けられます」