当SVN通知我冲突时,我希望能够使用kdiff3解决冲突。如何将其设置为默认工具?
前往Subversion配置文件(/etc/subversion/config
或 ~/.subversion/config
),并使用你喜欢的工具设置 merge-tool-cmd
变量:
### Set merge-tool-cmd to the command used to invoke your external
### merging tool of choice. Subversion will pass 4 arguments to
### the specified command: base theirs mine merged
# merge-tool-cmd = merge_command
尽管 kdiff3 存在一个问题,它不支持传递四个简单参数(SVN 会向 kdiff3 传递四个普通参数,但这样无法工作),因此通常会使用一个简单的脚本来转换参数进行调用,例如 "kdiff3caller":
#!/bin/sh
kdiff3 "$1" "$2" "$3" -o "$4"
这个kdiff3问题和解决方案在这里有详细说明。
#!/bin/bash
# Useful when something fails
LOG=~/svn-merge-kdiff-last-run.log
echo "arguments passed to $0: $@" > $LOG
# Now, don't think you will get the $1, $2, etc... by referencing.
# At first, you have to copy it to an array
for i in $@; do
args=( ${args[@]} $i )
done
echo "parsed args" >> $LOG
for i in ${args[@]}; do
echo $i >> $LOG
done
# I keep it in case something changes
if [ "${args[1]}" == "-m" ] && [ "${args[2]}" == "-L" ] && [ "${args[3]}" == ".mine" ];then
command="kdiff3 --L1 ${args[5]} --base ${args[9]} --L2 ${args[7]} ${args[10]} --L3 ${args[3]} ${args[8]} -o merged"
$command
if [[ $? -ne 0 ]]; then
echo "$command failed" >> $LOG
exit 1
fi
# You have to do this, otherwise after the merge you will see... empty file(?)
cat merged
rm merged
exit 0
fi
exit -1
把它绑定到~/.subversion/config中的svn
diff3-cmd = ~/svn-merge-kdiff
~/.subversion/config
中设置diff-cmd = /path/to/script.sh
。$older
的引用更改为 "$older"
等等。 - Charles Duffyyvoyer的答案中的脚本对我很有效,我正在使用SVN 1.4。我认为Jon Ander Ortiz Durántez之前的答案适用于SVN 1.5及更高版本,而此脚本适用于1.5之前的SVN版本。似乎在1.5版中对--diff-cmd和--diff3-cmd进行了更改。请比较以下2个SVN文档中的脚本以查看一些差异:
svn update
期间遇到冲突,它会启动kdiff3而不是在文件中吐出">>>>>>>>"冲突标记,这些标记如果你有复杂的冲突是非常难以解决的。 diff3-cmd适用于合并和更新。diff3-cmd = /usr/local/bin/svndiff3
添加到~/.subversion/config
(或在命令行上使用--diff3-cmd
),因为我编写了自己的脚本将svn diff
发送到sdiff,并由--diff-cmd
指定。
kdiff3 "$1" "$2" "$3" -o "$4"
。 - hlovdal[helpers]
部分下面。 - Marco Righelediff-cmd = kdiff3ForSvn
似乎没有执行正确操作(它看起来像是尝试自动合并)。有人尝试过仅使用kdiff3进行差异查看吗? - blong