2009-06-22 70 views

回答

8

为此,创建一个名为(例如)diff3wrap.bat的批处理文件,并在您的SVN配置中设置diff3-cmd以指向它。

以下diff3wrap.bat文件将完成这项工作。它为合并输出创建一个临时文件名,并在将合并的内容返回到SVN后删除它。

@ECHO OFF 

SET DIFF3="C:\Program Files\BeyondCompare3\BComp.exe" 

REM Subversion provides the paths we need as the last three parameters 
REM These are parameters 9, 10, and 11. 
REM Suitable titles for these three panes in the merge tool are in parameters 4, 6 and 8 respectively. 


REM But we have access to only nine parameters at a time, so we shift our nine-parameter window 
REM twice to let us get to what we need, thus changing the effective positions of the various parameters. 
REM 
SHIFT 
SHIFT 
SET MYTITLE=%2 
SET OLDTITLE=%4 
SET YOURTITLE=%6 
SET MINE=%7 
SET OLDER=%8 
SET YOURS=%9 
SET OUTPUTFILE=%OLDER%_%RANDOM%.merge 

REM Call BeyondCompare to perform the actual merge 
REM Note we give it a temporary output file and echo the output back out for SVN to use as the merged file 
%DIFF3% /lefttitle=%MYTITLE% /centertitle=%OLDTITLE% /righttitle=%YOURTITLE% /outputtitle="Merge Output" %MINE% %YOURS% %OLDER% %OUTPUTFILE% 

if NOT %errorlevel% == 0 goto :mergenotcomplete 

REM Merge complete. Echo the output to stdout for SVN to pick up as the result, then throw away the temporary file 

TYPE %OUTPUTFILE% 
del /f /q %OUTPUTFILE% 
exit 0 

:mergenotcomplete 
exit 1 
+0

根据SVN红皮书对此的看法,这看起来是正确的......我一接受检查就会接受答案。 – paxos1977 2009-09-12 18:20:06

+0

我刚测试过它,它工作正常(一旦你用你的盒子的正确安装路径替换了设置的DIFF3行)。 – 2011-01-14 22:17:59

1

我只有BC3和TFS的经验,所以带上一粒盐。 3路合并是我遇到的唯一问题。不止一次,我必须在BC3中手动复制和粘贴更改以完成合并。

+1

我在Windows上使用BC3通过龟。我可以说,BC3所做出的决定始终比Tortoise或SVN cli本身更为准确。我还为特定的文件类型/模式创建自定义配置文件,以便覆盖默认值。 – 2009-09-08 21:26:31

4

我喜欢liamf的批处理文件,但我认为它可能需要一个小的调整:

我添加automerge和reviewconflicts的命令调用,以便在合并的情况下,不会发生冲突,它只是在没有干预的情况下关闭 - 用户界面只会弹出来审查冲突。

因此,有问题的行变成了:

%DIFF3% /automerge /reviewconflicts /lefttitle=%MYTITLE% /centertitle=%OLDTITLE% /righttitle=%YOURTITLE% /outputtitle="Merge Output" %MINE% %YOURS% %OLDER% %OUTPUTFILE% 
1

这里是liamf的脚本,使用svn 1.6工作的一个Linux版本。

#!/bin/bash 

MYTITLE=$4 
OLDTITLE=$6 
YOURTITLE=$8 
MINE=$9 
OLDER=${10} 
YOURS=${11} 
OUTPUTFILE=${MINE}.merge 

/usr/bin/bcompare -solo -automerge -force -reviewconflicts -favorleft -lefttitle=$MYTITLE -centertitle=$OLDTITLE -righttitle=$YOURTITLE -outputtitle=$OUTPUTFILE $MINE $YOURS $OLDER $OUTPUTFILE 

RESULT=$? 

if [ $RESULT -eq 0 ] ; then 
    cat $OUTPUTFILE 
    exit 0 
else 
    exit 1 
fi 
1

这里有一个Cygwin的 bash脚本,与颠覆1.7同时适用于DIFF-CMD的diff3-CMD

#!/bin/bash 
# Set path to BeyondCompare 
bcomp=~/bin/bcomp; 

function bcerrlvl() { 
    echo -en "$1\t"; 

    case $1 in 
      0) echo "Success";; 
      1) echo "Binary same";; 
      2) echo "Rules-based same";; 
     11) echo "Binary differences";; 
     12) echo "Similar";; 
     13) echo "Rules-based differences";; 
     14) echo "Conflicts detected";; 
     100) echo "Error";; 
     101) echo "Conflicts detected, merge output not saved";; 
      *) echo "Error";; 
    esac; 

    return $1; 
} 

if [ "$1" = "-u" ]; 
then 
    # paths 
    left=$(cygpath --dos "$6"); 
    right=$(cygpath --dos "$7"); 

    # titles 
    titleleft="$3"; 
    titleright="$5"; 

    # compare command 
    $bcomp -title1="$titleleft" -title2="$titleright" "$left" "$right"; 

    if [ $? -gt 0 ]; 
    then 
     bcerrlvl $?; 
     exit $?; 
    else 
     exit 0; 
    fi; 
elif [ "$1" = "-E" ]; 
then 
    # Get to the tenth and eleventh arguments 
    shift; shift; 

    # paths 
    centre=$(cygpath --dos "$7"); 
    left=$(cygpath --dos "$8"); 
    right=$(cygpath --dos "$9"); 
    outext="_$(date +%s)-$RANDOM.merge"; 
    output="$(cygpath --dos "$8")_$outext"; 

    # titles 
    titlecentre=$2; 
    titleleft=$4; 
    titleright=$6; 
    titleoutput="Merge Output"; 

    # compare command 
    $bcomp -title1="$titleleft" -title2="$titleright" -title3="$titlecentre" \ 
     -outputtitle="$titleoutput" -automerge -reviewconflicts \ 
     "$left" "$right" "$centre" "$output"; 

    if [ $? -eq 0 ]; 
    then 
     outfile=$(cygpath --unix "$output"); 
     cat $outfile 
     rm -f $outfile 
     exit 0; 
    else 
     bcerrlvl $?; 
     exit $?; 
    fi; 
fi; 
相关问题