Синхронизация SVN репозитория
Синхронизация или зеркалирование репозитория в SVN выполняется командой svnsync. Для примера репозитория источника возьмём репозиторий с исходными текстами самого SVN:

Синхронизация потребует:http://svn.apache.org/repos/asf/subversion
- Использование консоли Windows и написания простых batch скриптов.
- Использования уже установленной консольной версии SVN или оболочки tortoisesvn (Windows Shell).
- Создание приёмного репозитория.
- Создание pre-revprop-change хуков.
- Подготовка приёмного репозитория для синхронизации и отладка хуков.
- Синхронизация.
1. Создание приёмного репозитория.
Создаём на диске директорию, где будет храниться копия базы данных SVN и куда будет происходить синхронизация. К примеру:Создаём репозиторий командой svnadmin:d:/svncopy/subversion
Или через оболочку tortoisesvn:>svnadmin create "d:/svncopy/subversion"


2. Cоздание pre-revprop-change хуков.
Перед тем как начать синхронизацию, необходимо разрешить SVN производить неверсионируемые изменения (без сохранения и отката истории) со своей базой данных. По умолчанию SVN это не разрешает. К примеру, редактирование комментариев к коммитам является неверсионируемым, поэтому такие изменения могут привести к потере данных из предыдущей версии. Идём в каталог с хуками (“d:\svncopy\subversion\hooks“) и копируем файл “pre-revprop-change.tmpl“ в тот же каталог только с расширением “.bat“:В этом файле содержится код скрипта для unix оболочки. Можно закомментировать весь текст и вставить примерно следующий код на языке Windows Batch:d:\svncopy\subversion\hooks\pre-revprop-change.bat
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 remrem REPOS="$1"rem REV="$2"rem USER="$3"rem PROPNAME="$4"rem ACTION="$5"remrem if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; firemrem echo "Changing revision properties other than svn:log is prohibited" >&2rem exit 1@echo offchcp 1251set "REPOS=%~1"set "REV=%~2"set "USER=%~3"set "PROPNAME=%~4"set "ACTION=%~5"if "%PROPNAME%" == "svn:sync-lock" (if "%ACTION%" == "A" exit /b 0if "%ACTION%" == "D" exit /b 0if "%ACTION%" == "M" exit /b 0)if "%PROPNAME%" == "svn:sync-from-url" (if "%ACTION%" == "A" exit /b 0if "%ACTION%" == "D" exit /b 0if "%ACTION%" == "M" exit /b 0)if "%PROPNAME%" == "svn:sync-from-uuid" (if "%ACTION%" == "A" exit /b 0if "%ACTION%" == "D" exit /b 0if "%ACTION%" == "M" exit /b 0)if "%PROPNAME%" == "svn:sync-last-merged-rev" (if "%ACTION%" == "A" exit /b 0if "%ACTION%" == "D" exit /b 0if "%ACTION%" == "M" exit /b 0)if "%PROPNAME%" == "svn:date" (if "%ACTION%" == "M" exit /b 0)if "%PROPNAME%" == "svn:sync-currently-copying" (if "%ACTION%" == "A" exit /b 0if "%ACTION%" == "D" exit /b 0if "%ACTION%" == "M" exit /b 0)if "%PROPNAME%" == "svn:author" (if "%ACTION%" == "M" exit /b 0)if "%PROPNAME%" == "svn:log" (if "%ACTION%" == "M" exit /b 0)echo.%~nx0: error: hook access denied: REPOS="%REPOS%" REV=%REV% USER="%USER%" PROPNAME="%PROPNAME%" ACTION=%ACTION% >&2exit /b 1
3. Подготовка приёмного репозитория для синхронизации и отладка хуков.
Чтобы подготовить репозиторий для синхронизации необходимо выполнить команду “svnsync init“:Ключ “–allow-non-empty“ необходим, если инициализация уже выполнялась:>svnsync init "file:///d:/svncopy/subversion" http://svn.apache.org/repos/asf/subversion --allow-non-empty
Если будет происходит следующая ошибка:svnsync: E000022: Destination repository is already synchronizing from 'http://svn.apache.org/repos/asf/subversion'
Значит указаны не все значения PROPNAME. Чтобы не выяснять их, можно в самом начале скрипта разрешить все значения: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
@echo off exit /b 0
4. Синхронизация.
Выполнить команду “svnsync sync“:Если хуки настроены правильно, то вы увидите следующий вывод:>svnsync sync "file:///d:/svncopy/subversion" http://svn.apache.org/repos/asf/subversion
Скорость синхронизации оставляет желать лучшего. В моём случае это было где-то 2 ревизии в секунду.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. ...