Как пропустить начальные ревизии в синхронизации svnsync (чтобы исправить поврежденный репозиторий) - PullRequest
2 голосов
/ 24 февраля 2011

Я хочу синхронизировать / скопировать один проект из умеренного большого репозитория 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%

Это работает, но занимает много времени, см. связанный вопрос . На самом деле мне не нужны какие-либо изменения до, например, г = 17830. И реальная проблема заключается в том, что до этой ревизии исходное хранилище было повреждено, и я не могу преобразовать его в hg, поэтому я пытаюсь обойти ...

Вопрос: Есть ли способ подделать только что созданный репо (после 4-й строки), чтобы он "поверил", что у него уже есть ревизия 17830 и продолжается с новыми. (Может, какая-то магия пропета?) До этой ревизии в папке / проекте не было никаких изменений.

Ответы [ 5 ]

1 голос
/ 20 октября 2015

Список рассылки SVN содержит ответ на эту тему; см http://svn.haxx.se/dev/archive-2010-02/0114.shtml

1 голос
/ 25 сентября 2012

Это возможно.

Вам необходимо создать файлы фиктивных оборотов в папках \db\revprops\0 и \db\revs\0, чтобы вы не получили ошибку there is no revision 17830.

1 голос
/ 18 марта 2011

svnsync будет копировать ревизии на основе значения в «текущем» файле (репозитория назначения) и записи в файле svnsync revprop 0, в которой указано, какая из копий является последней копией. Инициализируйте svnsync, затем добавьте оба этих номера к нужной ревизии, и она должна работать так, как вы хотите.

0 голосов
/ 18 декабря 2013

Попробуй, (только что понял)

1) проверить рабочую копию репозитория, который вы синхронизируете с

2a) сгенерируйте патч с помощью svn diff -rcurrent: затем из исходного репозитория (таким образом, текущая является текущей версией, а следующая является следующей, которая повреждена) тем не менее, большинство из найденных мной svn diff все еще работает

2b) или добавьте фиктивный файл в репозиторий, с которым вы синхронизируете, и отметьте его (чтобы вы могли могу проверить что-нибудь)

3) выполните svn ci -m 'syncfix', который увеличит репозиторий, который вы синхронизируете с

4) после этого синхронизация svnsync будет продолжаться большую часть времени

5) иногда он будет жаловаться, что ГОЛОВА - это одна ревизия в будущем. Чтобы исправить это перейти к / 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

Ондрей Попп

0 голосов
/ 18 декабря 2011

Судя по моим экспериментам, основанным на ответах, я считаю, что это невозможно.

...