2009-06-22 73 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; 
相關問題