В этой статье я продолжу рассказ об использовании Subversion – одной из самых популярных на сегодняшний день систем контроля версий.
В этот раз речь пойдет об использовании нескольких веток разработки.
Прежде всего, разберем, в какой ситуации может понадобиться несколько веток. Вариантов множество, но подробно анализировать мы их не будем, а просто рассмотрим конкретный пример.
Допустим, вы закончили разработку первой версии web приложения (или просто сайта). Теперь нужно перенести его на сервер хостера. В большинстве случаев при этом придется изменить параметры подключения к базе данных, отключить вывод подробного описания ошибок, profiling и т.п. Скорее всего, эти изменения затронут несколько файлов.
После отправки файлов на сервер, вы решили продолжить работу над проектом. Для этого, все настройки необходимо вернуть в исходное состояние. И так каждый раз при обновлении приложения на сервере. Думаю, никому не нужно объяснять, что это очень не удобно и может привести к ошибкам.
Как раз в этом случае нам и пригодится возможность Subversion создавать параллельные ветки разработки.
Идея простая. Создаем ветку для серверной версии проекта. Вносим в нее необходимые изменения и «заливаем» файлы на сервер. После этого переключаемся на основную ветку (файлы с настройками возвращаются в исходное состояние) и продолжаем разработку.
Одно из основных достоинств веток Subversion в том, что можно «сливать» любые изменения из одной ветки в другую. Таким образом, мы можем внести в ветку для сервера изменения из основной ветки так, что параметры подключения к БД останутся неизменными.
После переноса изменений нам останется только скопировать обновленные файлы на сервер.
Теперь рассмотрим конкретный пример.
Допустим, в репозитории проекта мы создали две папки:
trunk
– для основной ветки разработки;
branches
– для дополнительных веток.
Примечание. О том, как это сделать можно прочитать в статье «Эффективное управление проектами (Subversion)».
На данный момент проект в рабочем состоянии и находится в папке trunk
.
Как мы и говорили, создаем новую ветку, в папке branches
. В прошлой статье я немного рассказывал о ветках и переключении между ними, поэтому сейчас напомню только основные моменты.
Команда
svn copy file:///path_to_project/trunk
file:///path_to_project/brunches/web
-m “Ветка для размещения проекта на сервере”
создаст новую ветку разработки, которая будет размещена в папке brunches/web
репозитория.
Примечание. При создании новой ветки настоящего копирования файлов не происходит. Это предотвращает черезмерное увеличение репозитория. Тем не менее, с точки зрения пользователя работа с веткой ничем не отличается от работы с настоящей копией.
Переключаемся на созданную ветку
svn switch file:///path_to_project/brunches/web
Эта команда создаст рабочую копию ветки.
Вносим в нее любые изменения (например, меняем параметры подключения к базе данных) и выполняем команду commit
(т.е. сохраняем изменения в репозитории).
Очень важно писать осмысленные комментарии при сохранении данных, т.к. по ним придется ориентироваться в различиях между ветками. Фразы вроде «Все пофиксил» или «Куча мелких исправлений» не говорят ни о чем.
Теперь переключаемся на trunk
svn switch file:///path_to_project/trunk
И продолжаем работу.
В какой-то момент мы нашли и исправили ошибку в одном из файлов проекта. Теперь нужно исправить эту же ошибку на сервере. При этом в файл, который содержал ошибку, были внесены экспериментальные изменения, которые не должны попасть на сервер.
Т.е. нам нужно «слить» часть изменений из одной ветки в другую.
Прежде всего, нужно четко знать номера ревизий, которые содержат нужные изменения. Тут как раз и пригодятся созданные комментарии.
Посмотреть историю изменений можно с помощью команды
svn log
Она выведет список ревизий с комментариями. С помощью дополнительных параметров этой команды можно ограничить список:
svn log --stop-on-copy
– выводит перечень ревизий между последней и ближайшей, в которой была выполнена операция копирования (создания ветки)
svn log -r 100:200
– список изменений между ревизиями 100 и 200
svn log -r 100:HEAD
– между ревизией 100 и последней ревизией проекта.
Допустим, мы выяснили, что нужные нам изменения сделаны в ревизиях 205 и 206 основной ветки проекта.
Теперь переключаемся на ветку brunches/web
svn switch file:///path_to_project/brunches/web
И выполняем слияние
svn merge -r 205:206 file:///path_to_project/trunk
Эта команда выполнит слияние изменений из ревизий 205 и 206 ветки trunc
в текущую папку (на данный момент в этой папке находится рабочая копия ветки brunches/web
).
Теперь можно зафиксировать изменения ветки brunches/web
в репозитории с помощью команды commit
и скопировать исправленную версию приложения на сервер.
Очень важно. При выполнении команды commit
обязательно в комментарии укажите номера ревизий, из которых взяты изменения (например, «изменения из trunk -r 205:206»). Это позволит избежать повторного копирования этих изменений в дальнейшем.
После этого, можно опять переключаться на основную ветку (trunk
) и продолжать разработку.
Как видите, все довольно просто, а главное – удобно.
Примечание. Вам не обязательно использовать командную строку. Существует множество графических клиентов для Subversion, которые предоставляют удобный доступ к командам. Например, TortoiseSVN или Subclipse.
Заключение
Эта статья не является руководством по использованию веток, я просто привел пример их использования, который, на мой взгляд, удачно отражает их преимущества. Причем пример ориентирован на индивидуальных разработчиков или команды из двух-трех человек. Если вы хотите серьезно использовать Subversion при разработке, советую почитать книгу Управление версиями в Subversion. Это полное руководство об этой замечательной системе управления версиями.
Удачи!