Синхронизация или зеркалирование репозитория в SVN выполняется командой svnsync. Для примера репозитория источника возьмём репозиторий с исходными текстами самого SVN:
http://svn.apache.org/repos/asf/subversion
Синхронизация потребует:
  1. Использование консоли Windows и написания простых batch скриптов.
  2. Использования уже установленной консольной версии SVN или оболочки tortoisesvn (Windows Shell).
Синхронизация будет состоять из нескольких шагов:
  1. Создание приёмного репозитория.
  2. Создание pre-revprop-change хуков.
  3. Подготовка приёмного репозитория для синхронизации и отладка хуков.
  4. Синхронизация.

1. Создание приёмного репозитория.

Создаём на диске директорию, где будет храниться копия базы данных SVN и куда будет происходить синхронизация. К примеру:
d:/svncopy/subversion
Создаём репозиторий командой svnadmin:
>svnadmin create "d:/svncopy/subversion"
Или через оболочку tortoisesvn:

2. Cоздание pre-revprop-change хуков.

Перед тем как начать синхронизацию, необходимо разрешить SVN производить неверсионируемые изменения (без сохранения и отката истории) со своей базой данных. По умолчанию SVN это не разрешает. К примеру, редактирование комментариев к коммитам является неверсионируемым, поэтому такие изменения могут привести к потере данных из предыдущей версии. Идём в каталог с хуками (d:\svncopy\subversion\hooks) и копируем файл pre-revprop-change.tmpl в тот же каталог только с расширением “.bat“:
d:\svncopy\subversion\hooks\pre-revprop-change.bat
В этом файле содержится код скрипта для unix оболочки. Можно закомментировать весь текст и вставить примерно следующий код на языке Windows Batch:

3. Подготовка приёмного репозитория для синхронизации и отладка хуков.

Чтобы подготовить репозиторий для синхронизации необходимо выполнить команду svnsync init:
>svnsync init "file:///d:/svncopy/subversion" http://svn.apache.org/repos/asf/subversion --allow-non-empty
Ключ “–allow-non-empty необходим, если инициализация уже выполнялась:
svnsync: E000022: Destination repository is already synchronizing from 'http://svn.apache.org/repos/asf/subversion'
Если будет происходит следующая ошибка:
svnsync: E165001: Revprop change blocked by pre-revprop-change hook (exit code 255) with output:
pre-revprop-change.bat: error: hook access denied: REPOS="D:\svncopy\subversion" REV=0 USER="User" PROPNAME="svn:sync-last-merged-rev" ACTION=A
Значит указаны не все значения PROPNAME. Чтобы не выяснять их, можно в самом начале скрипта разрешить все значения:
@echo off

exit /b 0

4. Синхронизация.

Выполнить команду svnsync sync:
>svnsync sync "file:///d:/svncopy/subversion" http://svn.apache.org/repos/asf/subversion
Если хуки настроены правильно, то вы увидите следующий вывод:
Copied properties for revision 1.
Committed revision 2.
Copied properties for revision 2.
Committed revision 3.
Copied properties for revision 3.
Committed revision 4.
Copied properties for revision 4.
...
Скорость синхронизации оставляет желать лучшего. В моём случае это было где-то 2 ревизии в секунду.

Leave a Comment

Your email address will not be published. Required fields are marked *