В этой статье я продолжу рассказ об использовании 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. Это полное руководство об этой замечательной системе управления версиями. Удачи!