среда, 11 сентября 2013 г.

SVN рабочая копия удалённой репы

Создание рабочей копии удаленной реплики, если вам надоело лазить куда то далеко и хотите что бы всё лежало под боком у вас.



Создадим репозиторий для копии
$ svnadmin create /storage/mirror_svn
Перейдем в папку hooks нового репозитория
$ cd /storage/mirror_svn/hooks
Видим шаблоны хуков (*.tmpl). Создадим пустой хук в зеркале
$ echo "#!/bin/sh" > hooks/pre-revprop-change $ chmod 755 hooks/pre-revprop-change
Инициализируем репозиторий-зеркало
$ svnsync init file:///storage/mirror_svn http://master.svn/svn/ --source-username логин --source-password пароль
Будут установлены ряд свойств репозитория-зеркала, в нём же будет сохранён адрес удалённого репозитория.
Запустим передачу данных (синхронизируем репозиторий-зеркало с удалённым)
$ svnsync sync file:///storage/mirror_svn --source-username логин --source-password пароль
В некоторых случаях (например, если предыдущая синхронизация оборвалась аварийно), svnsync может жаловаться на то, что не может заблокировать репозиторий-зеркало. В этих случаях помогает такая команда:
$ svn propdel svn:sync-lock --revprop -r 0 ${COPYSVN} file:///storage/mirror_svn
Теперь добавим в крон (это не обязательно если вы хотели просто перенести репу к себе) для автоматической синхронизации
$ sudo nano /etc/cron.daily/svnsync
Содержимое:
#!/bin/bash if [ $(svn proplist --revprop -r 0 file:///storage/mirror_svn | grep sync-lock | wc -l) -ne 0 ]; then sleep 15 svn propdel svn:sync-lock --revprop -r 0 file:///storage/mirror_svn fi SVN_OUT=`svnsync --non-interactive sync file:///storage/mirror_svn --source-username логин--source-password пароль` echo $SVN_OUT
Проблемы, которые возникли и их рещения.
  • Происходило все под Ubuntu 12.04. А там neon в пакетах с проблемной работой через SSL. Ошибку сыпал при svnsync init - "OPTIONS of ': SSL handshake failed: SSL disabled due to library version mismatch ()"
    Удаляем libneon
    $ aptitude purge libneon27
    Берем deb пакет тут
    Устанавливаем зависимый libssl
    $ aptitude install libssl0.9.8
    Устанавливаем скаченный пакет
    $ dpkg -i libneon27_0.29.3-3_amd64.deb
    Меняем симлинки
    $ mv /usr/lib/libneon-gnutls.so.27 /usr/lib/libneon-gnutls.so.27.old $ ln -s /usr/lib/libneon.so.27 /usr/lib/libneon-gnutls.so.27
    Теперь успешно работает subversion по https протоколу
  • Синхронизация остановилась с ошибкой - "svnsync: Path 'script' not present".
    Проблема связанна с тем, что просмотр содержимого папки script для меня запрещен. В папку script/branches доступ у меня есть, но свн хочет получить список всех папок внутри script. А т.к. прав нет, то останавливается.
    Решение нашел тут. Subversion нужно пропатчить.
    Скачаем исходбники для Ubuntu 12.04. Работает от пользователя, а не рута
    $ cd ~/ $ apt-get source subversion
    Создадим фаил патча
    $ nano ~/patch-subversion--svnsync--sync.c
    Содержимое файла
    --- subversion/svnsync/main.c.orig 2012-11-28 13:42:57.933697896 +0200 +++ subversion/svnsync/main.c 2012-11-28 13:48:41.961690982 +0200 @@ -963,10 +963,29 @@ node_baton_t *pb = parent_baton; edit_baton_t *eb = pb->edit_baton; node_baton_t *db = apr_palloc(pool, sizeof(*db)); + svn_error_t *err; - SVN_ERR(eb->wrapped_editor->open_directory(path, pb->wrapped_node_baton, + err = eb->wrapped_editor->open_directory(path, pb->wrapped_node_baton, base_revision, pool, - &db->wrapped_node_baton)); + &db->wrapped_node_baton); + + if (err) + { + if (err->apr_err != SVN_ERR_FS_NOT_DIRECTORY) + SVN_ERR(err); + + /* + * In case we try to open a non-existent directory, this means we did + * not have visibility on the parent path when this directory was created, + * so just create it now. + */ + svn_error_clear (err); + SVN_ERR(eb->wrapped_editor->add_directory(path, pb->wrapped_node_baton, + /*copyfrom_path*/ NULL, + /*copyfrom_revision*/SVN_INVALID_REVNUM, + pool, + &db->wrapped_node_baton)); + } db->edit_baton = eb; *child_baton = db;
    Патчим
    $ cd ~/subversion-1.6.17dfsg/ $ patch -p0 < ../patch-subversion--svnsync--sync.c
    Ставим зависимости, чтоб собрать subversion
    $ sudo aptitude install debhelper libneon27-gnutls-dev libserf-0-0-dev libserf-dev libapr1-dev libaprutil1-dev libdb4.8-dev libsasl2-dev apache2-threaded-dev libsqlite3-dev libgnome-keyring-dev libdbus-1-dev kdelibs5-dev quilt doxygen swig python-all-dev python-all-dbg libperl-dev ruby1.8 ruby1.8-dev default-jdk junit
    Другой вариант установки зависимостей
    $ sudo apt-get build-dep subversion
    Запускаем сборку deb пакета. Внимание, под root работать не будет.
    $ dpkg-buildpackage
    У меня предыдушая команда не прошла вконце юнит тестирование. Я запустил без проверки
    $ DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage
    Установим новый пакет
    $ cd ../; $ sudo dpkg -i subversion_1.6.17dfsg-3ubuntu3_i386.deb
    Снова необходимо перебить линки
    $ mv /usr/lib/libneon-gnutls.so.27 /usr/lib/libneon-gnutls.so.27.old $ ln -s /usr/lib/libneon.so.27 /usr/lib/libneon-gnutls.so.27
  • Для хранилища, чтоб клиенты могли свободно переключаться на зеркало, нужно установить тот же UUID, что у мастер-репозитория. Сказано, сделано.
    Читаем в фаиил UUID
    $ svnadmin dump -r0 /storage/mirror_svn | head -n 3 > saved-uuid
    Записываем
    $ svnadmin load --force-uuid /storage/mirror_svn < saved-uuid
Терь все. Имеем всегда актуальную копию SVN репозитория.





источник: http://www.gyry.com.ua/article/svn-replikaciya-ili-prosto-kopiya

Комментариев нет:

Отправить комментарий