CygwinでmsysGitとGitを試しました。どちらも問題なく動作し、両方ともgitkとgit-guiを完全に実行します。
では、mergetoolをどのように構成すればよいのでしょうか。(VimdiffはCygwinで動作しますが、できればWindowsを愛する一部の同僚にとって、もう少しユーザーフレンドリーなものが欲しいです。)
CygwinでmsysGitとGitを試しました。どちらも問題なく動作し、両方ともgitkとgit-guiを完全に実行します。
では、mergetoolをどのように構成すればよいのでしょうか。(VimdiffはCygwinで動作しますが、できればWindowsを愛する一部の同僚にとって、もう少しユーザーフレンドリーなものが欲しいです。)
回答:
Charles Baileyの回答をフォローアップするために、p4merge(無料のクロスプラットフォーム3wayマージツール)を使用しているgitセットアップを以下に示します。msys Git(Windows)インストールでテスト済み:
git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'
または、Windowsのcmd.exeシェルから、2行目は次のようになります。
git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
変更(Charles Baileyに関連):
ダウンロード:http : //www.perforce.com/product/components/perforce-visual-merge-and-diff-tools
編集(2014年2月)
尖った出たよう@Gregory Pakosz、最新MSYSはgitの「ネイティブ」サポートは、今P4MERGE(上でテスト1.8.5.2.msysgit.0)。
次のコマンドを実行すると、サポートされているツールのリストを表示できます。
git mergetool --tool-help
利用可能なリストまたは有効なリストにp4mergeが表示されます。そうでない場合は、gitを更新してください。
場合P4MERGEをとしてリストされた利用できる、それはあなたの中にあるPATHとあなただけ設定する必要がmerge.tool:
git config --global merge.tool p4merge
有効と表示されている場合は、merge.toolに加えてmergetool.p4merge.pathを定義する必要があります。
git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
~
(その理論的にパスがある必要があり、現在のユーザのホームディレクトリに展開する必要があります~/AppData/Local/Perforce/p4merge.exe
)、これは私のために動作しませんでした$LOCALAPPDATA/Perforce/p4merge.exe
)を利用する方がよかったでしょう。gitはパスの環境変数を拡張していないようです(これを機能させる方法を知っている場合は、私に知らせてください、またはこの回答を更新してください)。mergetool.p4merge.cmd
Gitがp4mergeのサポートを試み始めたため、設定は機能しなくなりましたlibexec/git-core/git-mergetool--lib
。を参照してください。代わりに直接使用mergetool.p4merge.path
cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'
Windows 7のマシン上
Gitがp4mergeのサポートを開始したため、mergetool.p4merge.cmdの設定は機能しなくなりました。libexec/ git-core / git-mergetool--lib.soを参照してください。gitのmergetoolパスを指定するだけです。たとえば、p4merge:
git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge
その後、動作します。
私はWinXPでPortable Gitを使用しており(問題なく動作します)、分岐で発生した競合を解決する必要がありました。チェックしたすべてのGUIのうち、KDiff3が最も透過的に使用できることが判明しました。
しかし、Windowsで動作させるために必要な手順をこのブログの投稿で見つけました。この手順は、ここに記載されている他のアプローチとは少し異なります。基本的に、これらの行を.gitconfig
ファイルに追加することになります。
[merge]
tool = kdiff3
[mergetool "kdiff3"]
path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
keepBackup = false
trustExitCode = false
今すぐうまくいきます!
path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe
(二重のバックスラッシュに注意してください)
Cygwinの下で、私にとってうまくいった唯一のものは次のとおりです:
git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'
また、difftoolのプロンプトメッセージをオフにしたい:
git config --global difftool.prompt false
git mergetool
完全に構成可能であるため、お気に入りのツールをほぼ選択できます。
完全なドキュメントはここにあります:http : //www.kernel.org/pub/software/scm/git/docs/git-mergetool.html
簡単に言うと、ユーザー設定変数を設定することで、デフォルトのmergetoolを設定できますmerge.tool
。
マージツールがネイティブでサポートされているものの1つである場合はmergetool.<tool>.path
、ツールへのフルパスを設定するだけです(置換<tool>
構成済みのものにmerge.tool
ます)。
それ以外の場合はmergetool.<tool>.cmd
、シェル変数$BASE, $LOCAL, $REMOTE, $MERGED
を適切なファイルに設定して、実行時に評価されるように少しのシェルに設定できます。設定ファイルを直接編集するか、変数を設定してエスケープするかについては、少し注意する必要があります。git config
コマンドで。
このようなものは、あなたができることの味を与えるはずです( 'mymerge'は架空のツールです)。
git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'
お気に入りのマージツールをセットアップしたら、それを実行するだけです。 git mergetool
、解決する必要がある競合が発生したときするだけです。
PERFORCEのp4mergeツールは、非常に優れたスタンドアロンのマージツールです。
Windows 7での比較を超えて
git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
ええと、これは最終的に私のために働きました(Windows 7 + Cygwin + TortoiseMerge):
.git / config:
cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")
cygpathを使用するためのヒントを以前のポスターに感謝します!
私は彼らのマニュアル(http://manual.winmerge.org/CommandLine.html)からWinMerge(http://winmerge.org/)と呼ばれるアプリを使用しています
これは私がmergetool
ディレクティブから使用するbashスクリプトです.gitconfig
#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file
file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
then
file1="/tmp/gitnull"
`echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
then
file2="/tmp/gitnull"
`echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"
基本的にbashは、diffの結果が空のファイルにある場合を考慮し、正しい場所に新しい一時ファイルを作成します。
github Windowsで「SourceGear DiffMerge」をdifftoolとmergetoolとして構成する2つの方法を見つけました。
コマンドプロンプトウィンドウで次のコマンドを実行すると、.gitconfigが更新され、GITがDiffMergeを使用するように構成されます。
git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"'
git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'
[ または ]
次の行を.gitconfigに追加します。このファイルは、C:\ Users \ UserNameのホームディレクトリにある必要があります。
[diff]
tool = diffmerge
[difftool "diffmerge"]
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"
[merge]
tool = diffmerge
[mergetool "diffmerge"]
trustExitCode = true
cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
これらのオプションを追加することもできます。
git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false
また、理由はわかりませんが、ミラノガルディアンの回答からの引用とスラッシュは、私を混乱させました。
TortoiseGitのdiffツールとしてgvimを使用したい場合は、外部のdiffツールへのパスをテキスト入力に入力する必要があります。
path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
IntelliJ IDEA(Community Edition)の場合、Windows環境での3方向のgit mergetool構成(~/.gitconfig
)
Cygwin
[mergetool "ideamerge"]
cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
tool = ideamerge
Msys
[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
tool = ideamerge
〜/ winpath.shはmsysでパスをWindowsに変換するためのもので、stackoverflowのmsysパス変換の質問から取得されます
#! /bin/sh
function wpath {
if [ -z "$1" ]; then
echo "$@"
else
if [ -f "$1" ]; then
local dir=$(dirname "$1")
local fn=$(basename "$1")
echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';
else
if [ -d "$1" ]; then
echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';
else
echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';
fi
fi
fi
}
wpath "$@"