Home

Создаём свой freebsd svn mirror

Subversion из портов мы уже поставили.

Теперь выбираем директорию, где у нас будет лежать база svn.

# mkdir -p /usr/home/svnmirror/
# cd /usr/home/svnmirror/

Дальше идём сюда ftp://ftp.freebsd.org/pub/FreeBSD/development/subversion/ и выбираем тут файлы с самым большим номером релиза svn-репозитория. Потом меньше времени и трафика потребуется, чтобы синхронизировать базу до актуального состояния.

# fetch ftp://ftp.freebsd.org/pub/FreeBSD/development/subversion/svnmirror-base-r238500.tar.xz
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/development/subversion/svnmirror-doc-r39237.tar.xz
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/development/subversion/svnmirror-ports-r301235.tar.xz

Дальше распаковываем эти архивы.

# tar xvzf svnmirror-base-r238500.tar.xz
# tar xvzf svnmirror-doc-r39237.tar.xz
# tar xvzf svnmirror-ports-r301235.tar.xz

Теперь нужно это всё засервить в сеть.

Можно делать через apache. Ищи в интернетах setting up freebsd svn apache.

Я буду делать через svnserve.

Добавляем группу через vi /etc/group

svnserve:*:3690:

Добавляем юзера svnserve через добавление строки через vipw. Номер юзера по приколу сделал таким же, как и номер порта.

svnserve:*:3690:3690::0:0:svnserve:/home/svnmirror:/usr/sbin/nologin

Переписываем права доступа на директорию с базами:

# chown -R svnserve:svnserve /home/svnmirror/

Теперь самое долгое - синхронизировать базы. Можешь пропустить этот шаг. Потом оно обновится автоматически по cron'у. Если хочешь запустить последовательно все три команды, то объедини их с помощью &&.

# svnsync sync file:///home/svnmirror/base/
# svnsync sync file:///home/svnmirror/doc/
# svnsync sync file:///home/svnmirror/ports/

По дороге добавим задачу в cron. Чтобы оно на фоне обновилось. Время поставь другое, если надо.

Создадим файл по обновлению баз:

# vi /home/svnmirror/svnmirror.up.sh

Вставим в него строки: 

#!/bin/sh
/usr/local/bin/svnsync --trust-server-cert --non-interactive sync file:///home/svnmirror/base/
/usr/local/bin/svnsync --trust-server-cert --non-interactive sync file:///home/svnmirror/doc/
/usr/local/bin/svnsync --trust-server-cert --non-interactive sync file:///home/svnmirror/ports/

Проставим права на этот файл.

# chown svnserve:svnserve /home/svnmirror/svnmirror.up.sh
# chmod +x /home/svnmirror/svnmirror.up.sh

Допишем в крон задачу для пользователя svnserve (создадим его позже) по запуску файла /home/svnmirror/svnmirror.up.sh 

22      2       *       *       *       svnserve        /home/svnmirror/svnmirror.up.sh

Дописываем в файл /etc/rc.conf строки:

svnserve_enable="YES"
svnserve_flags="-d -R --listen-host 0.0.0.0"
svnserve_data="/home/svnmirror"
svnserve_user="svnserve"
svnserve_group="svnserve"

Запускаем svnserve как указано ниже или перезагружаем сервер ))) :

# /usr/local/bin/svnserve -d -R --listen-host 0.0.0.0  -r /home/svnmirror

Всё.

 

Можно обновляться со своего локального svn зеркала. Однако нас ждёт засада, если мы уже обновлялись до этого с другого svn'а. Оно скажет так:

svn: E155000: '/usr/ports' is already a working copy for a different URL

Есть команда по смене адреса у нужного репозитория. Выглядит так: svn relocate svn://YOUR-HOST/ports/head /usr/ports Но у меня она не сработала. Вернее, она молча выполнилась. А при попытке потом обновиться через команду уже со своего mirror'а svn co svn://YOUR-HOST/ports/head /usr/ports оно пишет кучу строк в таком стиле Skipped 'comms' -- Node remains in conflict. Выход из этой ситуации - удалить папку .svn.