10

我看到这篇文章解释了如何让 BC3 作为 Subversion 的差异工具工作......但是使用 Beyond Compare 3 进行 3 路合并/比较呢?

4

5 回答 5

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
于 2009-08-31T22:15:33.773 回答
4

我喜欢 liamf 的批处理文件,但我认为可能需要稍作调整:

我在命令调用中添加了 automerge 和 reviewconflicts,这样如果合并没有冲突,它就会在没有干预的情况下关闭 - UI 只会弹出来查看冲突。

因此,有问题的行变为:

%DIFF3% /automerge /reviewconflicts /lefttitle=%MYTITLE% /centertitle=%OLDTITLE% /righttitle=%YOURTITLE% /outputtitle="Merge Output" %MINE% %YOURS% %OLDER% %OUTPUTFILE% 
于 2010-01-27T17:43:23.167 回答
1

我只对 BC3 和 TFS 有经验,所以对此持保留态度。3 路合并是我遇到的唯一问题。不止一次,我不得不在 BC3 中手动复制和粘贴更改以完成合并。

于 2009-06-22T18:27:45.897 回答
1

这是适用于 svn 1.6 的 liamf 脚本的 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
于 2012-03-15T19:48:19.207 回答
1

这是一个Cygwin bash 脚本,它适用于diff-cmddiff3-cmd的Subversion 1.7

#!/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;
于 2012-07-12T02:15:46.240 回答