我在Cygwin上尝试了msysGit和Git。两者本身都工作得很好,并且都能完美地运行gitk和git-gui。
现在我该如何配置合并工具呢?(Vimdiff在Cygwin上工作,但我更希望能有一个对我们一些喜欢windows的同事更友好的东西。)
我在Cygwin上尝试了msysGit和Git。两者本身都工作得很好,并且都能完美地运行gitk和git-gui。
现在我该如何配置合并工具呢?(Vimdiff在Cygwin上工作,但我更希望能有一个对我们一些喜欢windows的同事更友好的东西。)
当前回答
Git mergetool是完全可配置的,所以你可以选择你最喜欢的工具。
完整的文档在这里:http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html
简而言之,您可以通过设置用户配置变量merge.tool来设置默认的合并工具。
如果合并工具是本地支持的工具之一,你只需要设置mergetool.<tool>。工具完整路径的路径(将<tool>替换为您已配置的merge. conf。成为工具。
否则,可以设置mergetool.<tool>。在运行时将shell变量$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工具是一个非常好的独立合并工具。
其他回答
要设置p4merge,使用chocoley在窗口上安装merge和diff,请看这里: https://gist.github.com/CamW/88e95ea8d9f0786d746a
Git mergetool是完全可配置的,所以你可以选择你最喜欢的工具。
完整的文档在这里:http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html
简而言之,您可以通过设置用户配置变量merge.tool来设置默认的合并工具。
如果合并工具是本地支持的工具之一,你只需要设置mergetool.<tool>。工具完整路径的路径(将<tool>替换为您已配置的merge. conf。成为工具。
否则,可以设置mergetool.<tool>。在运行时将shell变量$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工具是一个非常好的独立合并工具。
我用一个叫WinMerge的应用程序(http://winmerge.org/) 他们手册中的信息(http://manual.winmerge.org/CommandLine.html)
这是我通过.gitconfig从mergetool指令中使用的bash脚本
#!/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的结果,并在正确的位置创建一个新的临时文件。
对于kdiff3,您可以使用:
git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global mergetool.kdiff3.trustExitCode false
git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false
IntelliJ IDEA (Community Edition)在Windows环境下配置3路git合并工具(~/.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 "$@"