Как использовать Beyond Compare 3 как diff3-cmd для svn?
Я видел эту публикацию, в которой объяснялось, как заставить BC3 работать как инструмент diff для Subversion... но как насчет использования Beyond Compare 3 для 3-way merge/сравнивает?
Ответы
Ответ 1
Для этого создайте командный файл, называемый (например) diff3wrap.bat, и настройте свой diff3-cmd в конфигурации SVN, чтобы указать на него.
Следующий файл 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
Ответ 2
Мне нравится командный файл liamf, но я думаю, что это может сделать незначительную настройку:
Я добавил automerge и reviewconflicts для вызова команды, так что в случае слияния без конфликтов он просто закрывается без вмешательства - пользовательский интерфейс будет всплывать, чтобы просмотреть конфликты.
Таким образом, рассматриваемая строка становится:
%DIFF3% /automerge /reviewconflicts /lefttitle=%MYTITLE% /centertitle=%OLDTITLE% /righttitle=%YOURTITLE% /outputtitle="Merge Output" %MINE% %YOURS% %OLDER% %OUTPUTFILE%
Ответ 3
У меня есть опыт работы с BC3 и TFS, поэтому возьмите это с солью. Единственное, с чем я столкнулся, - это трехстороннее слияние. Не раз мне приходилось копировать и вставлять изменения вручную в BC3, чтобы завершить слияние.
Ответ 4
Вот Linux-версия liamf script, которая работает с svn 1.6.
#!/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
Ответ 5
Здесь Cygwin bash script, который работает с Subversion 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;