LXF82:Subversion

Материал из Linuxformat.

Перейти к: навигация, поиск

Однажды дождливой ночью Грэм Моррисон нечаянно скинул на сервер Subversion свой домашний каталог – и вдруг осознал всю полезность этой идеи. Вам тоже стоит так сделать.

А зачем? Зачем вообще использовать инструмент разработчиков для хранения собственных файлов? Вы, наверное, знаете, что Subversion обеспечивает доставку актуальной копии исходного кода совместно работающим над ним через сеть программистам. Но лежащая под этим технология также полезна и для других целей. Subversion – сервер, хранящий в репозитарии изменения, произведенные над группой файлов. Он позволяет и удалить нежелательное программное обеспечение, и установить его заново. Это не сложнее, чем набрать команду.

Для домашнего каталога это означает, что всегда имеется его интеллектуальная резервная копия. Можно не только спасти случайно удаленные данные, но и выбрать возможность восстановления до предыдущего состояния; или удалить неудачный вариант конфигурации; или посмотреть, как выглядели закладки в браузере год назад. Если вы работаете на нескольких машинах, то ваш домашний каталог синхронизируется с каждой из них – чем не изящное применение Subversion? Любые сделанные изменения тут же попадают на все машины, гарантируя однозначность копии /home. Забавно также выкатить часть вашего репо-зитария Subversion на публику, в форме Linux-блоггинга.

Так что «субвертите» ваш домашний каталог на здоровье, для этого не надо быть суперхакером. Все, кто не боятся командной строки, могут попробовать, а мы вам поможем.

Содержание

Установим сервер Subversion

Говоря попросту, Subversion – подобие умной базы данных, используемой программистами для отслеживания изменений в проекте на протяжении всего его существования. Без Subversion группе разработчиков одного проекта приходилось бы посылать все изменения лидеру проекта, а он затем вносил бы их в проект. Subversion заменяет лидера проекта сервером, и изменения вносятся автоматически. Важно, что сервер Subversion хранит только отличия между версиями, а каждое подтвержденное изменение называется пересмотром (revision). Проходя по пересмотрам вперед и назад, можно раздобыть копию любой стадии проекта.

В SUSE возможен HTTP-доступ к репозитарию Subversion, если добавить модули при помощи Yast.
В SUSE возможен HTTP-доступ к репозитарию Subversion, если добавить модули при помощи Yast.

Для Subversion безразлично, если вместо исходного кода вы загрузите свой домашний каталог; его дело – хранить изменения. Однако имеется несколько загвоздок. Прежде всего, проблемы вызываются большими двоичными файлами. Не то чтобы Subversion их не поддерживал, но они реально замедляют систему, так как Subversion вынужден их сравнивать, отслеживая разницу. Возможно, стоит держать большие файлы вне репозитария.

Руководство по установке

Труднее всего установить Subverion и заставить его работать в первый раз. Сервер не самая простая вещь, но ничего невозможного тут нет. Если ваш сервер располагается на той же машине, что и домашний каталог, то вряд ли понадобится настройка. Зато желание получать доступ к своему репозитарию через сеть намного все усложнит.

О том, как установить собственный сервер, говорилось в LXF70, но вкратце опишем процесс, чтобы вы смогли начать. Каждый солидный дистрибутив включает пакет Subversion, который легко устанавливается с помощью менеджера пакетов. Войдите в менеджер пакетов вашего дистрибутива, поищите пакет Subversion-server и установите его. Если вы уже использовали Subversion, можете установить дополнительные модули Apache и получить доступ к репозитарию через HTTP – ищите пакеты dav_svn и authz_svn.

Пользователей SUSE ждет проблема: сервер не входит в поставку SUSE 10.0. Поэтому поищите пакет Subversion-server-1.2.3-2.i586.rpm в интернете (или на диске к журналу) и установите его от имени суперпользователя с помощью команды rpm -Uvh *.rpm. Если вы используете Apache, можете также сконфигурировать его через Yast, выбрав Network Srvices > HTTP Server и нажав на Modules. Add Module позволит вам установить оба ‘svn’ модуля и модуль WebDav.

Перезапустите Apache, набрав от лица root в командной строке /etc/init.d/ Apache2 restart. SUSE опять не повезло: возникает ошибка undefined symbol: dav_svn_split_uri.

Все потому, что модули Apache должны загружаться в правильной последовательности. Откройте /etc/sysconfig/Apache2 в любимом текстовом редакторе, найдите строку, начинающуюся с ‘APACHE_ MODULES’, и позаботьтесь о следующем порядке загрузки модулей: dav dav_svn authz_svn. Теперь Apache перезапустится без проблем.

Выбор протокола

Доступ к репозитарию Subversion осуществляется с помощью URL. Существует три протокола доступа. Самый простой для конфигурации – URL, начинающийся с ‘file:///’. По нему доступ осуществляется к репози-тарию, размещенному на вашей файловой системе – просто проверьте, что слэшей три. Для такого доступа настройки вовсе не требуется. Установите Subvesion, и за работу!

Разработчики, использующие Subversion, могут работать над одним проектом одновременно. [1] Старая версия файла находится в репозитарии. [2] Два разработчика скачивают один файл. [3] Оба работают параллельно над своими частями файла, добавляя в них свой код. [4] Когда они отошлют результаты обратно на сервер, произведенные изменения сольются в один файл.
Разработчики, использующие Subversion, могут работать над одним проектом одновременно. [1] Старая версия файла находится в репозитарии. [2] Два разработчика скачивают один файл. [3] Оба работают параллельно над своими частями файла, добавляя в них свой код. [4] Когда они отошлют результаты обратно на сервер, произведенные изменения сольются в один файл.

Второй способ также легко реализовать, и он заключается в запуске отдельного TCP сервиса, для обслуживания запросов к серверу Subversion. Сложным это кажется только на первый взгляд. Проверьте, что установлена утилита Svnserve, создайте пользователя и группу ‘svn’ командами useradd и groupadd; затем запустите сервис Svnserve, набрав /etc/init.d/svnserve start. Под Mandriva и Red Hat он запускается командой service svnserve start.

Третий способ – использование HTTP через сервер Apache. Для ясности, мы в своих примерах будем использовать file:///, а вы можете избрать способ доступа по своему вкусу.

/HOME переезжает

После запуска сервера следующей задачей является заполнение репозитария данными из вашего домашнего каталога. Для начала создайте репозитарий с помощью команды svnadmin, определив, где именно хранить данные. (Заметим, что в последующих примерах мы проводим весь процесс для пользователя degsy.) svnadmin create /srv/degsy

Команда svnadmin не использует префикс протокола (file:///), потому что всегда запускается на стороне сервера.

Теперь надо скачать репозитарий с сервера, то есть просто создать локальную копию данных, размещенных на сервере. На текущий момент на нашем новом сервере никаких данных нет, но процедура скачивания создаст в вашем домашнем каталоге временное хранилище для файлов конфигурации, которые Subversion будет использовать для отслеживания изменений в ваших данных.

Приступим. Зайдите на вашу систему как суперпользователь и перейдите в каталог /home. Далее переименуйте каталог того пользователя, который собирается использовать Subversion. В нашем случае home/degsy станет home/foo. Изменение имени необходимо, чтобы не произошло перезаписи данных, потому что, когда мы выкачиваем домашний каталог из Subversion, он замещает исходный каталог. Опасаться нечего: в конце концов, мы всегда сможем вернуть наши данные из /foo. Вам надо выполнять операции от лица суперпользователя, потому как только он имеет права на проведение изменений в каталоге /home.

Переименовав каталог, создайте копию данных сервера Subversion, а заодно и файлы конфигурации: svn checkout file:///srv/degsy Checked out revision 0.

Каждый раз, когда вы производите изменение в файлах, находящихся на сервере Subversion, номер ревизии (пересмотра) увеличивается на единицу. Subversion использует атомарные изменения: неважно, сколько файлов успело поменяться в вашем домашнем каталоге – когда репозитарий обновится, все изменения пройдут как один пересмотр. В показанном выше примере число пересмотров равно нулю, потому что мы еще ничего не делали с репозитарием. В /home вы увидите каталог с именем вашего пользователя (то есть /home/degsy), и если вы поинтересуетесь содержимым этого каталога, то обнаружите, что в нем содержится всего одна запись. Чтобы просмотреть ее, наберите ls -al degsy и увидите следующее: drwxr-xr-x 7 root root 4096 2006-05-11 20:30 .svn

Это скрытый каталог Subversion, где будут храниться все изменения, а также исходные версии всех файлов. Теперь надо скопировать этот каталог .svn в исходный домашний каталог – который теперь называется /home/foo; именно он будет наполнять репозитарий Subversion. Далее, удалите скачанный с сервера каталог и верните исходному домашнему каталогу его предыдущее имя: cp -rf degsy/.svn foo/ rm -rf degsy mv foo degsy chown -R degsy:users degsy

Теперь все на своих местах, и можно предпринять важный шаг загрузки домашнего каталога Subversion на сервер. Начнем с команды add – она добавит файлы, которые Subversion посчитает новыми (то есть все). После add используем команду commit, которая проверит все изменения и загрузит их на сервер как неделимую атомарную ревизию. На этом этапе вас попросят написать комментарий, описывающий сделанные вами изменения. Программисты используют комментарии для описания сделанных изменений. Комментарии пригодятся и для вашего домашнего каталога, особенно если перемены значительны: например, сменился дистрибутив или оконный менеджер. Если вам необходимо вернуться к конфигурации до обновления, просто просмотрите комментарий.

Помните, что Subversion копирует все содержимое репозитария в скрытый каталог .svn, это удваивает требуемый объем дискового пространства.
Помните, что Subversion копирует все содержимое репозитария в скрытый каталог .svn, это удваивает требуемый объем дискового пространства.

Наберите svn add *, чтобы добавить все файлы вашего домашнего каталога на сервер Subversion: svn add *

A bin
A Documents
A Documents/.directory 
A images 
A (bin) images/IMG_0192.JPG

Двоичные файлы

Subversion теперь переберет все файлы, добавляя каждый из них в список файлов, которые необходимо закачать на сервер. Двоичные и текстовые файлы обрабатываются различным способом. Вот почему изображение в выше показанном примере помечено как bin. Изменения в двоичные файлы вносятся иначе, чем в текстовые, когда Subversion просто хранит прямые изменения между одной версией и следующей. Символ A в начале каждой строки означает, что каждый файл будет добавлен добавлен в репозитарий, но этого не произойдет, пока вы не запустите команду commit, решившись принять изменения окончательно. Также вас попросят написать комментарий, описывающий смысл изменений.

Получится следующее:

svn commit 
Adding Documents 
Adding Documents/.directory 
Adding bin Adding images
Adding (bin) images/IMG_0192.JPG 
Transmitting file data. 
Committed revision 1.

время выполнения этого процесса зависит от количества произведенных изменений и от скорости соединения с сервером Subversion. Когда вы в первый раз подтверждаете изменения вашего домашнего каталога, то наверняка потребуется значительное время для копирования всех ваших данных.

Вы, возможно, заметили, что есть одна жизненно важная группа файлов, которая не обновилась – а именно, скрытые файлы (их имена начинаются с точки «.») вашего домашнего каталога. Почему? Потому что это вызовет конфликт с собственным скрытым каталогом Subversion (.svn). Если вы знаете, какие каталоги вам нужны, добавьте их вручную. Следующая команда добавит, к примеру, конфигурационные файлы Gnome:

svn add 
.gnome2 A 
.gnome2 A 
.gnome2/accels 
svn commmit 
Committed revision 2

Альтернатива – перемещение скрытых каталогов (исключая .svn) в отдельный каталог и использовании простого скрипта для воссоздания символьных ссылок. Небольшой недостаток использования Subversion состоит в том, что, когда вы добавляете и удаляете файлы и каталоги, требуется повторять процесс для репозита-рия Subversion с помощью команд svn add для добавления и svn del для удаления, а затем выполнять commit для подтверждения изменений. Но трудно ли заменить эти команды скриптом?

Приемы работы

Итак, вы используете Subversion для хранения домашнего каталога. Посмотрим, что полезное можно сделать благодаря этому.

Защитить данные

Если вам надо получить доступ к домашнему каталогу через Интернет, то использование протокола ‘svn://’ может подвергнуть вас риску атаки прослушивания, когда кто-то перехватывает ваши данные во время их передачи. Решение состоит в использовании безопасной оболочки SSH. Просто замените ‘svn’ в URL на ‘svn+ssh’. Вам придется использовать учетную запись пользователя, существующую на сервере, а также проверить, что этот пользователь имеет право на доступ к репозитарию. Чтобы определить пользователя в URL, наберите: svn list svn+ssh://degsy@hostname/srv/degsy.

Везде как дома

Поместив свой домашний каталог на сервер Subversion, вы можете иметь те же файлы и настройки на нескольких машинах хоть на другом краю Земли. Так как машины синхронизируются с сервером, то вы можете быть уверенными, что используете актуальные файлы. Когда вы находитесь в каталоге /home на новой машине и хотите создать копию репозитария, то проверьте имя сервера и наберите svn checkout svn+ssh://hostname/srv/degsy Эта команда создаст копию домашнего каталога degsy в текущем местоположении. Любые изменения, сделанные вами на этой машине, надо отослать на сервер и подтвердить. По команде svn add * система проигнорирует старые файлы и добавит только новые.

Плановые правки

Обновление версии вручную - это фирменный рецепт, как лишиться файлов или синхронизации каталогов. Как ни печально, простого способа синхронизировать новые или удаленные папки и файлы в автоматическом режиме не существует -требуется все время набирать svn add и svn del; но самую длинную команду svn commit можно автоматизировать.

Добавьте команду commit в системную таблицу cron с помощью команды crontab. Предварительно создайте таблицу для пользователя с помощью команды crontab -e, а затем можно добавить запись для запуска команды commit: 15 00 * * * svn commit -m

“Automated commit”

Команда commit запустится в 00:15, а параметр -m говорит, что мы не хотим взаимодействовать с процессом для добавления комментария к изменениям.

Спасение рядового файла

Еще одна привлекательная черта такого репозитария - восстановление случайно удаленных или потерянных данных. Если вам требуется старая версия данных, то должна быть и возможность просмотреть изменения. Этой цели служит команда diff, которая точно скажет, что и где изменилось в файле.

Например, следующая команда в точности отобразит изменения между 5 и 6 ревизиями файла bookmarks.html: svn diff -r 6:5 file:///srv/degsy/bookmarks.html

Существует несколько способов восстановить файл с помощью этих данных, и самый безопасный из них - сохранить старую версию файла в новый каталог внутри домашнего каталога. С помощью команды svn copy укажите номер ревизии и путь, куда копировать: svn copy -r 6 file:///srv/degsy/bookmarks.html new.html

Резервное копирование

Грош цена вашему репозитарию, если данные вовремя не резервируются, особенно если ваш домашний каталог всегда временный. Отличное решение - запуск на сервере команды svnadmin dump: она выводит все содержимое репозитария на экран, но ведь вывод можно перенаправить и в файл! svnadmin dump >svn_backup

Проверьте, что svn_backup хранится в надежном месте, и не забывайте регулярно проводить эту процедуру. Восстановление данных из резервной копии обеспечит следующий трюк: svnadmin load /srv/degsy < svn_backup

Что дальше?

На радость хакерам, существует много способов для написания собственных решений в виде скриптов - например, по части хранения скрытых файлов и создания резервных копий. Subversion был задуман не для вашего домашнего каталога, но он невероятно гибок - так чего ж теряться?

Личные инструменты
  • Купить электронную версию
  • Подписаться на бумажную версию