...
...

Системы управления версиями для программистов и не только. Часть 4

Сегодня я продолжу рассказ об SVN. Управление версиями документов является важной задачей, нужной почти для каждого, кто работает в сфере IT. Самое главное — чтобы сложности, возникающие на этапе "понять и привыкнуть", не помешали вам научиться хранить документы в SVN, видеть историю изменений и оценивать ход работы. Поэтому наличие удобных графических средств является ключевым фактором для того, чтобы сделать быстрый старт и не отпугнуть от СУВ новичков.

Если же интегрировать СУВ вместе с системой "issue tracking", добавить к ним систему автоматической сборки проекта, тестирования, то можно решить одну из важнейших задач организации работы коллектива разработчиков — четкое разделение процесса по времени и исполнителям плюс ускоряется процесс внедрения в команду пришедших новичков. Прошлые статьи были посвящены не столько изучению консольных команд "svn …" (и правда, мало кто пользуется ими в своей практике) — главной целью было рассказать об основных идеях (ветви, теги, слияние, ревизии), лежащих в основе SVN (а, по сути, и для любой другой СУВ). Предупреждаю, что я работаю в среде windows, так что мой выбор инструментов может не подойти тем, кто предпочитает linux. Программные продукты, работающие с СУВ, можно разделить на две категории: общие и специальные.

Специальные поставляются в виде плагина для какой-либо программы. Условно говоря, если в старом добром блокноте windows появилось новое меню "SVN" с перечислением команд (commit, update, …), то это плагин. Фактически все современные среды разработки (eclipse, idea, zend) имеют в своем составе плагины, позволяющие извлекать файлы из репозитория, сохранять правки и т.д. не выходя из основного окна программы. Есть плагины и для графических редакторов, офиса. Об этом семействе программ я говорить не буду, т.к. оно слишком специфично. Клиенты SVN второго класса являются универсальными: они могут работать с SVN-хранилищами, не особенно задумываясь о том, хранятся ли там файлы на каком-то языке программирования, офисные документы или картинки. Именно это семейство программ — тема сегодняшнего материала. Клиентов SVN много, очень много. Полный их перечень можно найти по адресу: сайт . В практике я использую два svn-клиента: знаменитую tortoise (сайт проекта: сайт и менее известную smartSVN (домашний сайт: сайт ).

В сегодняшней статье будет много картинок и мало пояснений: все функции, о которых имеет смысл говорить, я описал в прошлых статьях, теперь осталось только их "визуально показать". Предположим, что вы загрузили инсталлятор tortoise, запустили его, после чего tortoise должен интегрироваться в проводник windows и изменить его контекстное меню. После установки и перезагрузки компьютера tortoise полностью готова к работе. Вспомним основные шаги при работе с SVN. Прежде всего, мы должны создать репозиторий и поместить в репозиторий проект — это разовые действия. Следующие же шаги выполняются каждый день: извлечь файлы из репозитория, отредактировать их, поместить обратно в хранилище. Начнем с создания репозитория (в прошлые разы я использовал для этого консольную утилиту svnadmin), теперь все проще: создадим новый каталог (желательно без русских букв или пробелов в названии). Заходим внутрь каталога с помощью проводника windows, вызываем контекстное меню (см. рис. 1) и выбираем пункт Tortoise SVN -> Create repository here (все остальные действия также выполняются только с помощью контекстного меню проводника).

Нас спросят, в каком формате должно быть создано хранилище: Native File System или Berkley Database. Особых различий между этими подходами нет: функциональные возможности идентичны, отличия же во времени развития (NFS более "молодая"), незначительно отличается скорость работы и поведение репозитория в случае программных или аппаратных сбоев. Я выбрал NFS, т.к. в прошлых статьях, когда рассказывал о настройках сервера svnserve (множественном доступе и политике безопасности), то использовался именно этот формат репозитория. После выполнения команды Tortoise SVN -> Create repository here репозиторий был создан, и нам пора перейти к начальному импорту в хранилище некоторого проекта (местоположение этого проекта не имеет никакого значения). В качестве примера я выбрал каталог project, использованный во всех прошлых заданиях.

Как показано на рис. 1, вы вызываете контекстное меню на папке project и активируете пункт Tortoise SVN -> Import. Затем в появившемся диалоговом окне (см. рис. 2) вы указываете путь к созданному шагом ранее каталогу репозитория. Здесь не забудьте о правилах хорошего тона при именовании подкаталогов: нельзя просто ввести путь к каталогу репозитория (например, H:\docs_xp\Storage), лучше сделать так: "H:\docs_xp\Storage\test\project\trunk" (вспомните, что я говорил о каталогах trunk, tags и branches в прошлой статье). Тут же, в окне импорта проекта, есть интересная галочка Include Ignored Files. Не всегда и не все файлы в папке проекта следует импортировать в репозиторий. Например, временные файлы или файлы, автоматически создаваемые в ходе разработки (тот же результат компиляции). В этом случае мы можем в настройках Tortoise указать, какие именно файлы не будут скопированы в репозиторий (Tortoise SVN -> Settings, закладка General и параметр Global Ignore Pattern). Если же отметить галочку Include Ignored Files, то в репозиторий будут скопированы абсолютно все файлы. Смежной с операцией импорта в репозиторий будет функция экспорта (меню Tortoise SVN -> Export). Отличие экспорта от обычного извлечения в том, что при экспорте не будут создаваться служебные каталоги .svn, где хранится информация, нужная для взаимодействия с репозиторием. Информацию, помещенную в репозиторий, можно просматривать без ее предварительного извлечения. В составе Tortoise есть специальный SVN-браузер (меню Tortoise SVN -> Repository Browser). Вид окна браузера показан рис. 3. По умолчанию в браузере показывается содержимое репозитория на момент последней сохраненной ревизии. Однако это можно изменить с помощью расположенной в самом верху окна браузера кнопки HEAD (на кнопке в общем случае отображается номер текущей ревизии), в появившемся диалоговом окне вводите номер ревизии и переходите к ней.

Теперь перейдем к циклу "извлечь-изменить-сохранить". Для первоначального извлечения проекта из репозитория используем пункт меню SVN Checkout (см. рис. 4), в графе URL of Repository указывается путь к каталогу, где находится репозиторий (можно указывать и адреса вида svn://имя- компьютера/путь-к-проекту), в поле Checkout directory указываете путь к каталогу, куда будет выполнено извлечение. Чтобы извлечь не последнюю ревизию проекта (HEAD), укажите ее номер в графе Revision. Остальные параметры тривиальны, кроме галочки Omit Externals. Она позволяет не извлекать из репозитория т.н. внешние зависимости. Что это такое, рассмотрим на примере. Предположим, у нас есть команда программистов, работающих над несколькими проектами одновременно. Для каждого из этих проектов нужны некоторые библиотеки. Положим, библиотечки создаются той же командой разработчиков (а может, просто внешняя библиотека "дорабатывается напильником" под нужны команды). Главное то, что мы не можем просто скопировать код этой библиотеки в каждый из проектов: ведь над библиотекой ведется постоянная работа, и, если некто Вася выполнил модификацию библиотеки, добавил функциональность, нужную для Васиного проекта, то, возможно, эта функциональность пригодится и кому-то другому.

Отдельно стоит вопрос о том, что слепой перенос правок в библиотеке во все остальные проекты может привести к возникновению ошибок. Собственно, эта проблема решается грамотной системой нумерации версий библиотеки и качественного покрытия автоматическими тестами всех проектов. Если для вас характерен именно такой стиль разработки (большое количество разрабатываемых проектов с общими частями), то настоятельно рекомендую посмотреть в сторону таких продуктов для управления проектами и их зависимостями, как maven. После завершения процедуры checkout'а внешний вид папки с содержимым проекта изменился: для каждого файла и папки добавилась маленькая иконка, указывающая на его состояние. Внешний вид иконок меняется и зависит от темы, используемой в tortoise (изменить тему можно в меню Tortoise SVN -> Settings -> Icon Set), но интуитивно ясно, что значок плюсика говорит о том, что файл добавляется в репозиторий и т.д. После извлечения проекта меняется и контекстное меню для всех файлов/каталога в управляемом SVN каталоге (см. рис. 7).

Еще изменения: к окну свойств для каждого файла (вызываем его через контекстное меню) к стандартному набору закладок windows добавится еще одна — Subversion (см. рис. 5). На этой закладке будет отображена информация об авторе файла, номере ревизии, когда файл был модифицирован в последний раз, номер текущей ревизии, даты этих событий. Особый интерес представляют две кнопки: Properties и Show Log. Первая из них служит для управления свойствами файла. О назначении свойств SVN я не рассказывал в прошлых статьях, т.к. в основном они нужны в случаях интеграции SVN с каким-либо еще программным продуктом, поддерживающим жизненный цикл разрабатываемого приложения). Вторая же кнопка в диалоговом окне свойств файла — Show Log — служит для вызова диалогового окна, в котором отображаются в виде таблицы сведения обо всех правках, выполненных над этим файлом за все время развития проекта (см. рис. 6). Если правок было очень много, то можно сузить отображаемый диапазон (внизу окна кнопка Show range). Для оценки выполненных над проектом затрат пригодится функция Statistics (расположена внизу того же окна). С ее помощью вы увидите графики, оценивающие количество правок, выполненных отдельными программистами (так мы узнаем, кто меньше всего работал), и количество правок во времени.

После первоначального извлечения проекта мы начинаем редактировать файлы. В ходе этого каждый измененный файл отслеживается tortoise, и для него меняется статус (меняется иконка-подсказка). Напоминаю, что нельзя просто удалить файл из репозитория (нужно использовать меню Tortoise SVN -> Delete). Для добавления файла в хранилище также используем меню Tortoise SVN -> Add. Функция Tortoise SVN -> Revert отменяет правки, выполненные над файлом. Функция Tortoise SVN -> Update Revision позволяет загрузить из хранилища произвольную версию файла. Чтобы увидеть историю правок файла в форме дерева, используем меню Tortoise SVN -> Revision Graph (см. рис. 8). Для переключения редактируемой версии (например, переход между основным стволом или веткой) используйте меню Tortoise SVN -> Switch. Завершающим аккордом работы над проектом будет его сохранение в репозиторий. Для этого используем меню SVN Commit, после чего покажется окно с перечислением всех выполненных модификаций файлов (см. рис. 9), там же вы должны ввести в текстовое поле значения примечания к выполненным изменениям, и информация будет послана на сервер. Еще не все: помните, я говорил, что правилом хорошего тона перед отправкой изменений на сервер будет их бегло просмотреть.

Так вот, в окне Commit'а, если выполнить двойной клик на файле, то откроется окно, разделенное на две части: в одной из них находится оригинальная версия файла, во второй — файл после выполненных вами правок (см. рис. 10), тут же обратите внимание, что измененные строки файла выделяются разными цветами. В следующий раз я завершу рассказ о работе с Tortoise (нам осталось разобраться с ветками, слияниями и разрешениями конфликтов), а также кратко опишу второй мой любимый svn-клиент SmartSVN.

black-zorro@tut.by, black-zorro.com

© Компьютерная газета

полезные ссылки
Аренда ноутбуков