27

当 SVN 通知我冲突时,我希望能够使用 kdiff3 解决冲突。如何将其设置为默认工具?

4

4 回答 4

31

转到 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 问题和解决方案。

于 2011-01-26T13:02:11.437 回答
4

一个更短且适用于更高版本的 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
于 2014-05-27T10:24:48.900 回答
3

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在 cmdline 上使用),因为我编写了自己的脚本以发送svn diff到 sdiff 并由--diff-cmd.

该脚本发布在yolinux上,稍作修改的版本(处理自动合并)发布在Jawspeak 上

于 2011-12-02T05:02:40.000 回答
3

I found this script somewhere I can't remember. but the author is Michael Bradley.

My answer is similar to Jon Ander Ortiz Durántez's answers. So if his answer doesn't work, you have a backup. I once tried something like he suggested, but it always output some error with the parameters until I found this scripts which resolved everything.

Create a script file and set diff-cmd = /path/to/script.sh in your ~/.subversion/config

#!/bin/bash

# Return an errorcode of 0 on successful merge, 1 if unresolved conflicts
# remain in the result.  Any other errorcode will be treated as fatal.
# Author: Michael Bradley

#注意:所有输出都必须使用“1>&2”重定向到标准错误,因为所有标准输出输出都写入输出文件

# 必须在“~/.subversion/config”文件中被subversion调用
# 添加配置:“diff-cmd = /path/to/script/myKdiff3.sh”

VDIFF3="kdiff3"
差异3 =“差异3”
差异=“kdiff3”  

用户提示 ()
{
    阅读答案
    案例“${answer}”在

        "M")
        回声 "" 1>&2
        echo "尝试将 ${baseFileName} 与 ${DIFF} 合并" 1>&2
        $VDIFF3 $older $mine $theirs --L1 $labelOlder --L2 $labelMine --L3 $labelTheirs -o $output 1>&2
        bLoop=1
        如果 [ -f $输出 ]; 然后
            如果 [ -s $输出 ]; 然后
                #输出写入成功
                bLoop=0
            菲
        菲
        如果 [ $bLoop = 0 ]; 然后
            猫$输出
            rm -f $输出
            出口 0
        别的
            echo "合并失败,重试" 1>&2
        菲

        ;;

        “米”)
        回声 "" 1>&2
        echo "正在尝试自动合并 ${baseFileName}" 1>&2
        diff3 -L $labelMine -L $labelOlder -L $labelTheirs -Em $mine $older $theirs > $output
        如果 [ $? = 1]; 然后
            #不能自动合并
            rm -f $输出
            $VDIFF3 $older $mine $theirs --L1 $labelOlder --L2 $labelMine --L3 $labelTheirs -o $output --auto 1>&2
            bLoop=1
            如果 [ -f $输出 ]; 然后
                如果 [ -s $输出 ]; 然后
                    #输出写入成功
                    bLoop=0
                菲
            菲
            如果 [ $bLoop = 0 ]; 然后
                猫$输出
                rm -f $输出
                出口 0
            别的
                echo "合并失败,重试" 1>&2
            菲
        别的
            #我们可以自动合并,我们已经做到了
            猫$输出
            rm -f $输出
            出口 0
        菲
        ;;

        “差异3” | “差异3” | “DIFF3”)
        回声 "" 1>&2
        回声“差异...” 1>&2
        $VDIFF3 $older $mine $theirs --L1 $labelOlder --L2 $labelMine --L3 $labelTheirs 1>&2
        ;;

        “差异” | “差异” | “差异”)
        回声 "" 1>&2
        回声“差异...” 1>&2
        $DIFF $mine $theirs -L $labelMine -L $labelTheirs 1>&2
        ;;

        “一个” | “一个” )
        回声 "" 1>&2
        echo "正在接受远程版本的文件..." 1>&2
        猫${他们的}
        出口 0
        ;;

        “我” | “一世” )
        回声 "" 1>&2
        echo "保持本地修改..." 1>&2
        猫${我的}
        出口 0
        ;;

        "R" | "r")
        回声 "" 1>&2
        echo "恢复到基础..." 1>&2
        猫 ${旧}
        出口 0
        ;;

        "D" | "d")
        回声 "" 1>&2
        echo "Runnig diff3..." 1>&2
        diff3 -L $labelMine -L $labelOlder -L $labelTheirs -Em $mine $older $theirs
        #退出并返回diff3的值(必要时写出文件)
        退出 $?
        ;;

        "S" | "s")
        回声 "" 1>&2
        echo "保存以备后用..." 1>&2
        猫${我的}
        #Exit with return vaule of 1 强制写入文件
        1号出口
        ;;

        “失败” | “失败” | “失败” )
        回声 "" 1>&2
        echo "失败..." 1>&2
        2号出口
        ;;

        "H" | “H” )
        回声 "" 1>&2
        echo "使用选项:" 1>&2
        echo " [A]ccept 接受 $labelTheirs 并丢弃本地修改" 1>&2
        echo " [D]efault 使用 diff3 合并文件(与 vanilla SVN 的行为相同)" 1>&2
        echo " [Fail] 杀死命令(不建议)" 1>&2
        echo " [H]elp 打印此消息" 1>&2
        echo " [I]gnore 保持本地修改的版本不变" 1>&2
        echo " [M]erge 使用 ${VDIFF3} 手动合并" 1>&2
        echo " [m]erge 与 "M" 相同,但如果可能会尝试自动合并" 1>&2
        echo " [R]evert 恢复到基本版本 (${labelOlder})" 1>&2
        echo " [S]ave 与 'I' 相同,但写出 rold、rnew 和 rmine 文件以供以后处理" 1>&2
        echo " [diff] 在做出决定之前键入 'diff' 以区分版本 $labelMine 和 $labelTheirsthe" 1>&2
        echo " [diff3] 输入 'diff3' 以在做出决定之前区分所有三个版本" 1>&2
        回声 "" 1>&2
        ;;

        * )
        echo "'${answer}' 不是一个选项,再试一次。" 1>&2
        ;;
    经社理事会
}

如果 [ -z $2 ]
然后
    echo ERROR: 这个脚本需要被 subversion 调用
    1号出口
菲

如果 [ $2 = "-m" ]
然后
    #设置变量
    标签矿=${4}
    标签旧=${6}
    标签他们的=${8}
    我的=${9}
    旧=${10}
    他们的=${11}
    输出=${9}.svnDiff3TempOutput
    baseFileName=`echo $mine | sed -e "s/.tmp$//"`

    #提示用户方向
    而 [ 1 ]
    做
        回声 "" 1>&2
        echo "${baseFileName} 需要合并。" 1>&2
        回声 "" 1>&2
        回声“你想做什么?” 1>&2
        echo "[M]erge [A]ccept [I]gnore [R]evert [D]efault [H]elp" 1>&2
        用户提示
    完毕
别的
    L="-L" #左标签的参数选项
    R="-L" #右标签的参数选项
    label1=$3 #左标签
    label2=$5 #右标签
    file1=$6 #左文件
    file2=$7 #正确的文件

    $DIFF $file1 $file2 $L "$label1" $L "$label2" &
    #$DIFF $file1 $file2 &
    #等待命令完成
    等待
菲
出口 0
于 2011-01-26T22:16:06.003 回答