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\0there is no revision 17830

于 2012-09-25T14:15:56.507 に答える
0

答えに基づいて助けられた私の実験から、これは不可能だと思います。

于 2011-12-18T18:45:36.383 に答える
0

これを試してください(これを理解しただけです)

1) 同期しているリポジトリの作業コピーをチェックアウトします

2a) ソース リポジトリから svn diff -rcurrent:next を使用してパッチを生成します (つまり、current が現在のリビジョンで、next が次の壊れたリビジョンです)。

2b) または、同期しているリポジトリにダミー ファイルを追加してタグを付ける (何かをチェックインできるようにする)

3) svn ci -m 'syncfix' を実行すると、同期先のリポジトリがバンプされます

4) この後、ほとんどの場合、svnsync 同期が続行されます

5) ときどき、HEAD が将来の 1 つのリビジョンであると不平を言うことがあります。これを修正するには、/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

オンドレイ・ポップ

于 2013-12-17T23:52:55.533 に答える