2

我想使用(通常)序列从中等大小的 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%

这可行,但需要很长时间,请参阅相关问题。事实上,在 r=17830 之前,我不需要任何修改。真正的问题是,在这个修订版之前,原始仓库似乎已经损坏,我无法将其转换为 hg,所以我尝试解决...

问题: 有没有办法伪造新创建的回购(在第 4 行之后),所以它“相信”它已经有修订 17830 并继续使用更新的回购。(也许是一些道具魔术?)在该修订之前,项目/文件夹中没有任何更改。

4

5 回答 5

1

svnsync 将根据(目标仓库的)“当前”文件中的值复制修订,以及 svnsync revprop 0 文件中的条目,该条目说明哪个是最后复制的修订。初始化 svnsync,然后将这两个数字修改为您想要的版本,它应该可以按您的意愿工作。

于 2011-03-18T09:51:53.230 回答
1

这个有可能。

您需要在文件夹中创建虚拟 rev 文件\db\revprops\0\db\revs\0以免出现错误there is no revision 17830

于 2012-09-25T14:15:56.507 回答
1

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

于 2015-10-20T19:40:25.323 回答
0

根据我的实验并得到答案的帮助,我相信这是不可能的。

于 2011-12-18T18:45:36.383 回答
0

试试这个,(刚刚想通了)

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

翁德雷·波普

于 2013-12-17T23:52:55.533 回答