如何跳过svnsync sync中的初始修订(修复损坏的存储库)

时间:2011-02-24 13:18:23

标签: svn repository svnsync

我想使用(通常)序列从一个中等大型SVN仓库中同步/复制一个项目

  svnadmin create %mirror%
  rem make insecure dummy hook
  echo rem dummy > %mirror%\hooks\pre-revprop-change.bat
  svnsync init %mirror_url% http://svn/original/...
  svnsync sync %mirror_url%

这可行,但需要很长时间,请参阅related question。事实上,在例如之前我不需要任何修改。 R = 17830。而真正的问题是原版回购在修改前似乎已损坏,我无法将其转换为hg,所以我尝试解决...

问题: 有没有办法伪造新创建的仓库(在第4行之后),因此它“相信”它已经具有修订版17830并继续使用新版本。 (也许是一些propset魔术?)在该修订之前,项目/文件夹中没有任何变化。

5 个答案:

答案 0 :(得分:1)

svnsync将根据“当前”文件(目标库存)中的值以及svnsync revprop 0文件中的条目复制修订,该文件说明复制的最后修订版本。初始化svnsync,然后将这两个数字捏合到您想要的修订版本,它应该可以正常工作。

答案 1 :(得分:1)

这是可能的。

您需要在\db\revprops\0\db\revs\0文件夹中创建虚拟转介文件,这样就不会收到错误there is no revision 17830

答案 2 :(得分:1)

SVN邮件列表对该主题有答案;见http://svn.haxx.se/dev/archive-2010-02/0114.shtml

答案 3 :(得分:0)

根据我的实验和答案的帮助,我认为这是不可能的。

答案 4 :(得分:0)

试试这个,(只想出来)

1)查看您正在同步的存储库的工作副本

2a)从源存储库生成一个带有svn diff -rcurrent的补丁:next       (所以当前是当前版本,接下来是下一个被破坏的版本)       但是,我发现svn diff的大多数仍然有用

2b)或者,将虚拟文件添加到要同步的存储库并标记它(所以你     可以办理入住手续)

3)做一个svn ci -m'yncfix',它会碰撞你正在同步的存储库

4)此后,svnsync同步将在大部分时间继续

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同步将继续

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

Ondrej Popp