试试这个,(刚刚想通了)
1) 签出要同步到的存储库的工作副本
2a)使用 svn diff -rcurrent:next 从源存储库生成一个补丁(因此 current 是当前版本,下一个是下一个损坏的版本)但是,我发现的大部分 svn diff 仍然有效
2b)或者,将一个虚拟文件添加到您正在同步到的存储库并标记它(这样您就可以签入一些东西)
3)做一个 svn ci -m 'syncfix' 这将碰撞你正在同步到的存储库
4)在此之后,svnsync sync 大部分时间都会继续
5) 有时它会抱怨 HEAD 是未来的一个修订版。要解决此问题,请转到 /db/revprops/0 编辑 0 文件, chmod +w 0 修改修订版,
....
svn:sync-last-merged-rev
V 4
8499 <--- this one, add one to it so 8500 in this example
END
6)在此之后,svnsync sync 将继续
7) 下面是我刚刚为克服困难而编写的脚本,最终结果可能并不完美,但它会包含大部分内容。然后您可以通过从存储库的 HEAD 导出到最终结果来修复最终结果您正在同步。
set -x
SYNC_REPO=/repo/reelbox.org-sync
SRC_WD=/src/Multimedia/Reelbox/reelbox.org
SYNC_WD=/src/Multimedia/Reelbox/reelbox.org-sync
bumpRevision()
{
SYNC_REPO_FILE=$SYNC_REPO/db/revprops/0/0
cd $SYNC_WD
svn update
CUR_REV=`svn update | awk '{print $3}' | sed s/\.$//`
echo $CUR_REV
NEXT_REV=`expr $CUR_REV + 1`
echo $NEXT_REV
cd $SRC_WD
echo svn diff -r$CUR_REV:$NEXT_REV, >>SYNCLOG
svn diff -r$CUR_REV:$NEXT_REV 2>>SYNCLOG >$SYNC_WD/patch.in
echo >>SYNCLOG
LOG=`svn log -r$NEXT_REV`
cd $SYNC_WD
patch -p0 < patch.in
RESULT=`svn diff`
echo $LOG
echo $RESULT
if [ -n "$RESULT" ]; then
echo patched
svn ci -m "syncfix:$LOG"
else
echo not patched
if [ ! -f FIXFILE ]; then
echo $NEXT_REV > FIXFILE
svn add FIXFILE
else
echo $NEXT_REV >> FIXFILE
fi
svn ci -m "syncfix:nothing patched:$LOG"
fi
}
doSync()
{
svnsync sync file://$SYNC_REPO
STATUS=$?
if [ $STATUS == 1 ]; then
ECODE=`svnsync sync file://$SYNC_REPO 2>&1 | awk '{print $2}' | sed s/:$//`
echo $ECODE
case $ECODE in
E000022)
exit 1
;;
esac
fi
return $STATUS
}
# bumpRevision
doSync
while [ $? == 1 ]; do
bumpRevision
doSync
done
翁德雷·波普