Журнал LinuxFormat - перейти на главную

LXF70:Subversion1

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

Содержание

Subversion. Установка репозитария

ЧАСТЬ 1: Subversion (англ. «ниспровержение», «подрыв») – это отличное решение open-source для управления процессом разработки вашего проекта. Соответственно, в LXF всегда под рукой собственный «подрывник», Грэхем Моррисон, который расскажет вам об этом.

В старые добрые времена программисты имели обыкновение скрываться в своих лабораториях, записывая ленты на машинах размером с орган Кавайе-Колля, что установлен в соборе Сердца Христова в Париже. Результаты их работы, вместе с программами, которые эти результаты генерировали, можно было сохранять только на бумажных лентах, что делало совместную работу несколько затруднительной. Тим Бернерс-Ли (Tim Berners-Lee) разом изменил это. Теперь компьютеры объединены в сети, и в разрабатываемые проекты вовлекаются сотни или даже тысячи людей, активно поддерживающих друг друга. Без такого сетевого сотрудничества у нас не было бы Linux.

Магической основой совместной разработки проекта можно назвать контроль версий. При этом используется программа для отслеживания каждого единичного изменения или исправления в проекте – это сложнее сделать, чем сказать. Как вы поступите, если сразу несколько разработчиков будут редактировать один и тот же участок кода? Или если очередное дополнение тем или иным образом повредит проекту? Первому приложению контроля версий, Revision Control System, или RCS, написанному Вальтером Тичи (Walter Tichy), были присущи многие эти проблемы. Сегодня RCS в большинстве случаев заменено другими программами, среди которых присутствует пакет Subversion, о котором и пойдет речь.

Я буду исследовать Subversion в серии из трех уроков. В этом выпуске вы получите представление об администрировании сервера, от импорта проектов разработки до предоставления удаленного доступа и интеграции с сервером Apache. В следующем месяце мы охватим клиентскую часть Subversion, и третий урок покажет вам более «продвинутые» особенности, такие как ветвления (branching) и теггинг (tagging). Я очень надеюсь, что это улучшит совместную работу, но не в том смысле, что мы обсудим печать ваших собственных копий Манифеста Коммунистической партии для последующего распространения среди друзей и коллег.

Наследие CVS

Сперва – немного истории, которая объяснит, как мы получили Subversion из RCS. Хотя первоначально RCS была очень полезна, в ней имелись довольно большие «дыры». В частности, она не позволяла оперировать с проектом в целом, только с отдельными файлами, и лишь один пользователь мог работать с файлом в данное время. Дик Гран (Dick Grune), расстроенный тем, что не может использовать RCS для совместной работы со студентами над проектом компилятора, занялся разработкой альтернативы, и в 1986-м году свет увидела первая версия программы Concurrent Version System (CVS).

В основу CVS положена весьма простая идея. Дерево исходного кода проекта сохраняется на сервере, называемом «репозитарий». Каждый разработчик должен извлечь собственную копию этого дерева, скачав исходный код на свою локальную машину. Эта копия становится «рабочей». Любые изменения, которые разработчик выполняет в своей рабочей копии, должны быть занесены назад в репозитарий и зафиксированы. Если более чем один разработчик изменял одну и ту же часть кода, возникает конфликт, который CVS не в состоянии разрешить, и код требует ручного редактирования перед тем, как сервер позволит выполнить его фиксацию (commit).

Как вы могли заметить, CVS использует клиент-серверную модель. Сервер обрабатывает содержимое, когда клиент сообщает изменения, которые должны быть сделаны в дереве документов сервера. CVS не всегда используется для исходных текстов приложений: на самом деле, есть несколько странных людей, которые пытаются использовать CVS для управления всей своей жизнью, но это уже совсем другая история.

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

Новое решение

Система Subversion была разработана как непосредственная открытая замена для CVS, выстроенная «с нуля», чтобы решить многие проблемы своей предшественницы. Версия 1.01 была выпущена в марте 2004-го года, а как раз сейчас начинается тестирование версии 1.2.0 Во главе списка ее отличительных особенностей – контроль версий каталогов, который не может обеспечить CVS. Это ключевой момент, поскольку Subversion позволяет вам манипулировать каталогами таким же образом, как и файлами – переносить, переименовывать, копировать и удалять. Основанная на файлах структура CVS – причина ее еще одной большой проблемы. При фиксации изменений существует вероятность потерять соединение на полпути. В случае с CVS, результатом этого станет ситуация, когда половина файлов от разработчика будет обновлена, в то время как другая половина – нет, что не оставит администратору никакой возможности разобраться, какие файлы изменялись, а какие остались старыми. Решение, которое предлагает Subversion, заключается в том, что все изменения в репозитарии выполняются «атомарно». Это означает, что все изменения вносятся как единая транзакция, исключающая «полуобновление» файлов и двойную фиксацию. Это, наряду с другими существенными добавлениями («дешевые» ветвления и тэггинг, отличная поддержка двоичных форматов), сделает обновление до Subversion почти обязательным для пользователей CVS уже в ближайшем будущем.

Subversion доступна для загрузки с сайта http://Subversion.tigris.org под лицензией CollabNet/Tigris.org, которая аналогична лицензии Apache; ее разработчики рекомендуют версию 1.1.4. Как только вы установите эту программу, вам захочется задействовать ее для использования в своем собственном проекте.

Часть 1 – установка репозитария

Первый шаг при администрировании репозитария Subversion – создание структуры и заполнение ее файлами. Subversion использует базу данных Berkeley, которая ограничивает инсталляцию локальной файловой системой потому, что Berkeley полагается на файловую систему, которая поддерживает относительно «продвинутые» особенности, не доступные в настоящий момент в сетевых аналогах (таких как Samba или NFS). Как только будет выбрано место для размещения репозитария, вы можете создать его, используя команду svnadmin, предназначенную для внесения значительных изменений в репозитарий.

Чтобы создать собственный репозитарий с именем subres, выполните следующую команду в каталоге, в котором вы хотите разместить его (я буду использовать /usr/share):

$ svnadmin create subres

Управление репозитарием Subversion не очень отличается от CVS. Самое главное для администратора - это понять файловую систему, используемую в Subversion. Имеется в виду не файловая система типа ext3 или Reiser, а структура и организация файлов, которую ожидает получить SVN. Приведенная выше команда генерирует структуру в каталоге subres, который теперь должен содержать пару файлов и несколько директорий.

Этими директориями являются: conf, dav, db, hooks и locks. Conf содержит специфический файл конфигурации репозитария – svnserver.conf. Каталог dav содержит системную «бухгалтерскую» информацию, особым образом используемую модулями доступа Apache. Директория db хранит все системные файлы базы данных Berkeley. «Ловушки» (hooks) – это скрипты, которые могут выполняться при возникновении некоторого события (см. врезку «Ловушки Subversion»). Таким событием может являться, например, фиксация или изменение версии, и каталог hooks содержит скрипт-пример для каждой операции, которую осуществляет SVN. Директория locks содержит данные блокировок, ответственные за отслеживание доступа к репозитарию.

Для начала теории достаточно. Прежде чем приступить к использованию репозитария, нам нужно импортировать в него дерево исходного кода. Как и в случае с CVS, это можно сделать, используя команду svn import. Subversion использует URL, чтобы ссылаться на размещение, причем локальные директории предваряются тремя прямыми слэшами, чтобы показать, что это не Интернет-адрес. Позже, когда мы будем настраивать модули Apache, мы будем использовать HTTP, чтобы вернуться к более знакомому использованию прямых слэшей.

$ svn import -m “Initial project import”
Adding helloworld/helloworld.cpp
Adding helloworld/Makefile
Committed revision 1.

Как вы видите на выводе, команда import берет содержимое каталога helloworld и помещает в репозитарий два файла; вложенные каталоги также будут включены. То, что вы видите, - концептуальное отличие Subversion от CVS: номер ревизии используется для всего обновления, а не для каждого файла. Зафиксированный номер ревизии отражает каждое атомарное обновление.

Чтобы убедиться, что файлы успешно добавлены в репозитарий, вы можете вывести список содержимого, используя команду ls:

$ svn ls file:///usr/share/subres
Makefile
helloworld.cpp

Чтобы извлечь рабочую копию проекта, используется команда «co» в каталоге, в который вы хотите поместить проект:

$ svn co file:///usr/share/subres
A subres/helloworld.cpp
A subres/Makefile
Checked out revision 1

Все очень просто! И на этом мы завершим первую часть.

"Ловушки" Subversion (врезка)

«Ловушки» выполняются при наступлении определенного события в репозитарии. Каждое событие соответствует одному из следующих сценариев из каталога hooks:

Start-commit. Он запускается перед началом транзакции и проверяет, обладает ли пользователь соответствующими полномочиями для ее фиксации.

Pre-commit. Этот скрипт выполняется после завершения транзакции в репозитарии, но, что важно, до того как будет выполнена окончательная фиксация. Он нужен, чтобы убедиться, что вся транзакция придерживается политики фиксации в репозитарии. Эта политика может быть достаточно простой, например, проверка места назначения, но скрипт может также быть полезен для запросов авторизации или для занесения результата фиксации в инструмент отслеживания ошибок.

Post-commit. Этот сценарий часто используется, чтобы предоставлять информацию о новой ревизии в список рассылки, посвященный разработке проекта, после того как транзакция будет зафиксирована. Subversion даже включает пример как раз для этих целей (см. Subversiontools/hook-scripts/commit-email.pl).

Pre-revprop-change. Свойства собственной ревизии Subversion являются единственными данными в репозитарии Subversion, версии которых не отслеживаются. Это означает, что изменения этих свойств будут потеряны, если администратор не предпримет никаких действий по сохранению предыдущих значений. Именно для этого предназначен данный скрипт - он выполняется перед изменением свойств, позволяя легко автоматизировать необходимые операции.

Post-revprop-change. В зависимости от наличия сценария pre-revprop-change, этот скрипт выполняется после того, как свойства ревизии будут изменены. И снова напомню, что пакет Subversion включает пример, показывающий, как сообщить команде разработчиков о произошедших изменениях свойств.

Персональные инструменты
купить
подписаться
Яндекс.Метрика