Запись была отнесена к рубрике «Техники» 15.02.2008, Пт в 08:26. Вы можете следить за общением по теме этой записи с помощью RSS 2.0 ленты. Вы можете оставить отзыв, или trackback с Вашего сайта.
Системы контроля версий. Согласитесь, звучит. А чем дольше пользоваться одной из них, тем все более соблазнительные для искушенных умов рисуются перспективы. Начнем.
В этой статье мы поговорим, установим и попытаемся использовать в своих корыстных целях одну из разновидностей СКВ — Subversion. Почему так? Subversion очень популярна среди разработчиков, предоставляется многими хостерами, а возможная тесная интеграция с web-сервером Apache только добавляет ей очков. Чем-то Subversion походит в этом отношении на PHP — также много отличных альтернатив, но…
Примечание: не стоит думать, что Subversion это «только под web и для web». Соответствующим образом настроенная эта СКВ подойдет всем кто к ней готов.
Подавляющее большинство разработчиков приходят к СКВ, когда им перестает хватать резервного копирования проекта в виде стека директорий (оставим в стороне случай, когда использование СКВ — требование «свыше», мы все не любим насилие). Кто-то пытается подвести под наименование таких директорий некую систему (к примеру, в виде дат), кто-то хранит описание копий в файлах, кто-то находит решение в соответствующем ПО вроде nnbackup. Однако приходит определенный момент и мысли тянутся к более эффективным решениям — СКВ. Установив одну из них, можно не беспокоиться о создании резервных копий данных — все будет сделано автоматически. Более того, вскоре вы даже забудете о таком явлении как резервирование, вы будете пользоваться широкими возможностями СКВ, не замечая, что создается один backup за другим. И это хорошо.
Также одной из самых распространенных причин применения СКВ может служить командная разработка. В таком случае контроль монопольного редактирования, отслеживание изменений и их слияние являются настоящим кошмаром, если не использовать СКВ.
Использование СКВ оправдано как в случае одиночного разработчика, так и для ситуации когда их несколько.
Для начала необходимо усвоить базовые понятия и термины, единые для большинства различных СКВ. Их не много:
Также потребуется рассмотреть самые известные реализации СКВ, чтобы знать об их возможностях и недостатках:
Дополнительную информацию о приведенных и других реализациях СКВ можно найти, запросив Google.
Даже на первый взгляд видна исключительная аппетитность SVN. Возможно, дело в предвзятом изложении материала, но вероятнее всего, что это законное положение лидера.
Будем последовательны — разовьем тему SVN.
Главное преимущество SVN — интеграция с Apache. Это настоящий подарок web-разработчикам — один привычный сервер, известные подходы в обеспечении безопасности, авторизованного доступа и прочего.
CVS также имеет модуль позволяющий использовать ее с Apache, но он слабо распространен и последний раз обновлялся в далеком 2003 году.
Свобода на пространстве файловых операций: файлы и директории как в рабочей копии, так и в хранилище можно свободно копировать, перемещать, удалять — никаких накладок это не вызовет.
SVN всегда передает в хранилище «дельту» — только измененные данные. Не важно, бинарный ли это файл или любимые цитаты с башорга, но на сервер отправятся только новые данные.
Спокойствие за свои изменения при закреплении их в хранилище — SVN или закрепит все изменения, или не сделает этого вовсе, так что путаницы не будет.
Надо ли говорить, что SVN также наследует все положительные стороны своего родителя — CVS.
Отличным инструментом, предоставляемым SVN, является команда вычисления разницы, которая может применяться как к отдельным файлам, так и к правкам. Хотите узнать, что было изменено коллегой или левой рукой за вчерашний день? Это просто.
Нельзя вычислить отобразить разницу между двумя директориями, двумя фильмами или другими бинарными файлами. К слову, для некоторых бинарных файлов возможность сравнения все же имеется, но реализована она на уровне хака, надстройки. К файлам такого рода относятся в основном файлы офисного пакета MS Office и ограниченный набор файлов изображений.
Несколько разработчиков могут редактировать один и тот же файл и если их изменения не пересекаются, то SVN даже не пикнет — оба изменения будут закреплены автоматически. Возможно, что вы об этом даже не узнаете.
Всегда в распоряжении возможность создания веток — самостоятельных линий разработки, начинающихся в точке ветвления и ничем не отличающихся от основной по принципам работы. Это очень удобно, когда требуется внедрить в проект некую функциональность, реализация которой потребует множества правок. Ваши действия будут мешать остальным разработчикам (или вам самим) просто тем, что какое-то продолжительное время не смогут быть завершены. По окончанию работы в ветке изменения, внесенные в проект на ее пути, можно «слить» в основную линию разработки с минимальными усилиями со стороны разработчиков.
Различают три способа установки SVN сказывающиеся на типе доступа к хранилищу:
В случае интеграции с Apache возможна установка только для Apache версии 2.x. Это связано с рядом архитектурных особенностей второй ветки сервера. Если вы используете Apache версии 1.x, можно порекомендовать установить Apache версии 2.x в виде второго web-сервера на другом порту.
Сравнение двух первых способов можно видеть в таблице ниже:
| Возможность | Apache + mod_dav_svn | svnserve |
|---|---|---|
| Авторизация: | стандартное установление личности средствами HTTP (S), сертификаты X.509, LDAP, NTLM, а также другие механизмы, доступные для использования в Apache | CRAM-MD5 или SSH |
| Хранение учетных записей: | внутренний файл «users» | внутренний файл «users» или использование существующих системных (SSH) учетных записей |
| Шифрование: | опционально через SSL | опционально через SSH-туннель |
| Логирование: | полное логирование каждого HTTP запроса как это настроено в Apache | не поддерживается |
| Просмотр через web: | ограниченная встроенная поддержка, или использование программ сторонних разработчиков, таких, как ViewVS | только при помощи программ сторонних разработчиков, таких, как ViewVS |
| Скорость: | более низкая | более высокая |
| Установка: | более сложная | менее сложная |
Оба вышеописанных варианта подразумевают, что доступ к хранилищам будет предоставляться на основе парадигмы «клиент-сервер». Это частая ситуация когда разработчиков много. Однако нередко нужно развернуть систему контроля версий без подобных сложностей. В таком случае потребуется только клиент — программа необходимая в любом случае. У подхода есть один минус — файловая система, на которой находится хранилище, должна быть локальной.
Если заниматься разработкой web-приложений под управлением Apache, то выбор очевиден — один и привычный сервер. В ином случае целесообразно использовать поставляемое с SVN svnserve. Когда же требуется локальная реализация SVN, без доступа извне, то можно обратить внимание на третий вариант.
Так как статья носит web-ориентированный характер, мы коснемся только реализации «SVN через протокол WebDAV» под управлением сервера Apache. Этот способ даст нам следующие преимущества по сравнению с другими:
Условимся использовать в этой статье пути, которые используются мной в повседневности: мне удобно излагать, а вам не привыкать видеть чужие конфиги. Также «сразу» предупреждаю, что разговор будет идти на языке Windows. Извините.
Пусть Apache установлен у нас как это видно на рисунке ниже. Содержимое home — ряд директорий, внутри которых имеется директория www — DocumentRoot соответствующего виртуального хоста.

Вид директорий с которыми мы будем иметь дело
Файловая организация популярного пакета denwer и используемая в данной статье, пересекаются в home — функции этой директории идентичны и там, и там. Этот факт может помочь для перенесения изложенного материала на рабочее пространство denwer.
Убедимся, что у нас есть, установлено и настроено все необходимое:
Брать дистрибутив SVN из-за ОСзависимости лучше с сайта разработчика. Установка не вызывает обычно вопросов, но есть пара нюансов:
Ссылку на дистрибутив TortoiseSVN, визуального клиента SVN для Windows, можно найти во все том же разделе загрузок. Установка. Игнорирование предложения перезагрузиться.
Конфигурирование Apache. Многие используют комплект denwer, у меня своя сборка триады Apache, PHP, MySQL, есть иные варианты. Объединяет их одно — во всех случаях файл httpd.conf должен существовать. Им и займемся:
LoadModule dav_svn_module "@SubversionDir@/Subversion/bin/mod_dav_svn.so"
LoadModule dav_module modules/mod_dav.so
<Location /svn> DAV svn SVNParentPath "d:/www/svn_repository" </Location>
Создаем d:\www\svn_repository, перезагружаемся и пытаемся запустить Apache. В случае удачи ничто вас не побеспокоит. Если же что-то пошло не так, то следует разобраться в ошибке с помощью чтения логов и действий по обстоятельствам.
Теперь, когда все необходимое установлено и работает можно вручить свой проект в надежные руки SVN.
Обычный процесс работы с SVN можно изобразить, как это сделано на схеме ниже, которая отражает полный цикл жизни: от создания хранилища до его использования.

Схема действий при работе с SVN
Кружочек с вложенным кружочком на схеме означает, что действие составное — может состоять из многих различных действий.
Разберемся со всем по порядку:
Для того чтобы различные действия были понятны договоримся каждый из шагов снабжать популярным объяснением которое будет основано на двух персонажах:
Подобная, очень упрощенная, организация процесса труда принята для повышения эффективности разработки в целом. Но представьте себе ситуацию, когда разработчик, например в ситуации с личным блогом, один. Никто не возьмет на себя роль лидера, ее придется выполнять самостоятельно. Поэтому, если какие-то действия покажутся вам странными и непонятными, попытайтесь распределить роли и все встанет на свои места.
Этот шаг можно сравнивать с примерным лидером который готовит рабочее место для разработчика наряду с созданием ftp аккаунтов и прочих подобных вещей.
Лидер уже располагает какими-то данными, но он также понимает, что не все из них нужно отдавать в хранилище даже если эти «излишки» нужны в работе. Своими действиями он готовит чистую заготовку рабочей копии без всякого мусора — базовую редакцию.
Частичка svn в этом пути взялась из httpd.conf, где мы указали ее в директиве Location, с тем же успехом можно было бы написать в обоих местах my_pretty_good_svn_directory. Что касается частички trunk, то по ее поводу забегите немного вперед, если вам интересно.
В зависимости от объема импортируемых данных зрелище будет более или менее впечатляющее… и длительное;
Лидер создает фундамент на котором силами разработчика будет строиться вся разработка. Таковым фундаментом является первая правка в хранилище — результат прошедшего импорта.
До тех пор пока не будете уверенно использовать SVN, всегда делайте резервирование данных проекта привычным для вас образом. В процессе обучения, чтобы начать все с чистого листа, обычно не раз удаляется хранилище — а значит и резервные копии.
Делается это потому, что оригинал проекта не содержит еще данных о версиях файлов, а значит, не является рабочей копией. Директорию нужно таковой сделать. Для этого и производится удаление, чтобы потом создать под этим же именем директорию, которая будет рабочей копией с точки зрения SVN и файлами, составляющими блог, с точки зрения Apache. Далее, для пустой директории web-dev.info запустите команду контекстного меню SVN→Checkout…, URL хранилища нужно взять из предыдущего шага: http://127.0.0.1/svn/web-dev/trunk. Теперь, после завершения, у вас есть рабочая копия вашего хранилища, с которой можно производить любые действия, вплоть до забрасывания проекта;
Лидер продолжает заботиться о разработчике и делать свою работу. На этом этапе он создал собственную рабочую копию т.к. необходимо навести порядок с файлами, исключенными на этапе предимпортной настройки. Тем, что над лидером нет никого, кто сделал бы эту работу для него и обусловлена эта чехарда с удалением оригинала и созданием пустой директории.
Лидер и разработчик на данном шаге одноправны — оба вносят различного рода изменения. То, что мы лишь добавили игнорирование некоторых объектов, не говорит, что это единственное действие, которое можно производить для изменения хранилища. Например, разработчик всегда будет менять файлы, находясь на этом этапе, самом часто посещаемом.
Теперь, когда более или менее подробно разобраны все обычно необходимые и достаточные шаги по оперированию хранилищем и рабочей копией вы можете начать развивать собственную практику общения с SVN. Осталось немного, некоторые подводные камни и нюансы.
@ECHO Off IF "%4" == "svn:log" GOTO :SVN_LOG EXIT 1 :SVN_LOG EXIT 0
Если вы дошли до этих строк, значит, вам это было нужно, выпейте чаю. Также возможно, что у вас просто быстрый скроллинг, но это не умаляет предыдущую мысль.
Спасибо за пояснение по pre-revprop-change. В самом деле просто.
Не согласен, что TFS — старший брат VSS. Это не родственные системы. По идеологии и архитектуре они практически ничего общего не имеют. Система контроля версий TFS больше походит по функционалу на SVN (где-то отстает, где-то привосходит SVN по функционалу), чем на VSS.
Вероятно, я неточно выразился. Подразумевалась не преемственная связь, а мощностная — если нужно что-то большее, то MS предлагает в качестве решения TFS.
да, действительно, большое спасибо за pre-revprop-change, очень простое решение (непонятно, зачем нужно было делить реализацию перезаписи лога, если в DAV'е это настраивается вполне легально, выставив права пользователям)
Пожалуйста. Кстати, хотелось бы заметить, что код хука приведён для Win32, т.е. непригоден для безоговорочного использования.
Привет, из всех виденных статья лучшая и доходчивая ), но у меня не получилось настроить subversion. Установка нормально прошла, хранилище создается нормально, но вот проблемы при запуске denwer'a. До редактирования config сервер работает нормально, после раскоментирования LoadModule сервер выдает ошибку. Сами модули *.so в module/ присутствуют, в bin/ тоже есть. Кто нибуть сталкивался с таким? Как решить проблему?
nonick, ответил вам на почту.