git内でWinmergeを使用してDiffを行う方法はありますか?
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
ではwinmerge.sh
、あなたのディレクトリ部分に保存されていますPATH
:
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -u -dl "Local" -dr "Remote" "$1" "$2"
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つの一時ディレクトリを移入した後に一度、代わりにファイルのペア毎に一度外部ツールのインスタンスを実行しているのを。
詳細については、「パッチdifftool
:difftool
ディレクトリの差分を処理することを教える」と回答「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
セッションが閉じます。
git diff
?
c:\Temp\GitDiff\old
とのファイルの比較が表示されます。このDOSプログラムをDOSセッション(bashセッションではない)から実行してよろしいですか?c:\Temp\GitDiff\new
/tmp
""
実行(私の場合はgit config
WindowsのCMDからのコマンドをしかし、あなたは正しいです:それは、と評価されてしまうからです""
。bashシェルから実行された場合
最初のパーツを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")"
スレッドが混乱して二股になっているので、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
。
別の.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部分全体が引用されています
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\"
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?.exe
。git config --get mergetool.winmerge.cmd
実際に設定されたものを確認するために実行します。とにかく、非.sh
バージョンをありがとう:+1!
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
、各ファイルに対して一度ずつ指定コマンドを実行するように見える、私は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への呼び出しで後者を使用している理由です。
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"
ありがとうございました!
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のコマンド・ライン・マニュアル:「パラメータがいずれかのスラッシュ(/)またはダッシュが付いている( - )文字」