【发布时间】:2011-06-15 18:56:41
【问题描述】:
当 SVN 通知我冲突时,我希望能够使用 kdiff3 解决冲突。如何将其设置为默认工具?
【问题讨论】:
当 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"
here解释了这个kdiff3问题和解决方案。
【讨论】:
kdiff3 "$1" "$2" "$3" -o "$4"。
[helpers] 部分下。
diff-cmd = kdiff3ForSvn 似乎没有执行正确的操作(它看起来像是在尝试自动合并)。有没有人尝试使用 kdiff3only 查看差异?
svn update 冲突吗?它将有不同的文件集:file.mine file.rOLDREV file.rNEWREV
一种更短且适用于更高版本 SVN 的解决方案(在 SVN 1.7.7 上测试):
创建一个脚本~/svn-merge-kdiff
#!/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
【讨论】:
我在不记得的地方找到了这个脚本。但作者是 Michael Bradley。
我的回答类似于 Jon Ander Ortiz Durántez 的回答。因此,如果他的回答不起作用,您有一个备份。我曾经尝试过他建议的方法,但它总是输出一些参数错误,直到我找到解决所有问题的脚本。
创建一个脚本文件并在您的~/.subversion/config 中设置diff-cmd = /path/to/script.sh
【讨论】:
$older 的引用更改为 "$older" 等。
yvoyer 回答的脚本对我来说非常有用,我使用的是 SVN 1.4。我认为 Jon Ander Ortiz Durántez 的先前回答适用于 SVN 1.5 及更高版本,并且此脚本适用于 1.5 之前的 SVN 版本。似乎对 1.5 版的 --diff-cmd 和 --diff3-cmd 进行了更改。比较以下 2 个 SVN 文档中的脚本以了解一些差异:
Michael Bradley 的脚本非常有用,因为现在如果我在 svn update 期间遇到冲突,它会进入 kdiff3,而不是使用“>>>>>>>>”冲突标记来吐槽整个文件,这很难如果您有复杂的冲突,请解决。 diff3-cmd 适用于合并和更新。
我将diff3-cmd = /usr/local/bin/svndiff3 添加到~/.subversion/config(或在命令行上使用--diff3-cmd),因为我编写了自己的脚本以将svn diff 发送到sdiff,并且由--diff-cmd 指定。
【讨论】: