Системы контроля версий и клиенты для Windows: TortoiseSVN

SVN и TortoiseSVN

Установка клиента
Скачиваем установочный пакет с http://tortoisesvn.net/downloads.html и запускаем установку.
svninstall01
Жмем “Далее” до тех пор, пока не дойдем до окошка
svninstall03
Обратите внимание на клиента командной строки. Я сначала не устанавливал его, но сейчас думаю, что лучше поставить. Так что ставим галочку и продолжаем установку.
Клиент интегрируется в оболочку Windows, т.е. почти все операции производятся через контекстное меню Проводника. Когда-то мне это показалось очень удобным, сейчас я в этом уже не уверен.
Создание центрального репозитория
Поскольку TortoiseSVN полностью интегрируется в проводник, вызываем окно Проводника Windows, открываем диск V: и вызываем контекстное меню для V:\VesionControl:
svn_rep001
Создаем в этом каталоге репозиторий
svn_rep002
По идее крайне желательно создать всю структуру каталогов и уже потом можно запускать RepoBrowser
svn_rep003
Прежде чем помещать файлы в SVN, не помешает узнать, а какие файлы эта система будет обрабатывать, а какие – нет.
Есть несколько вариантов установки, какие файлы игнорировать, а какие нет.
Первый вариант состоит в редактировании установок SVN. Это глобальные настройки, касаться они будут всех репозиториев – как созданных, так и будущих. Вызовем TortoiseSVN Settings

Появится окно вида
svn_rep006
В строке Global ignore pattern перечислены маски файлов, которые будут игнорироваться SVN. Можно добавить сюда свои варианты (например, *._ls *.bak *.dwl*). Одно “но” – я не увидел, как здесь добавлять каталоги (ведь может потребоваться игнорировать целые каталоги – например, временные каталоги компиляции debug-версий). Теоретически можно редактировать конфигурационные файлы, но я этим не занимался.
Второй способ – выбрать “неотслеживаемый” файл и в конт.меню для него вызвать TortoiseSVN – Ignore file. К сожалению, этот вариант “проходит” только после создания репозитория. Кроме того, если файлов / каталогов много, работа по их добавлению в “игнор” быстро превращается в муку.
Помещение в центральный репозиторий данных с сетевого диска
Выберем каталог, который мы хотим поместить в SVN (например, начнем с каталога Apps):
svn_rep004
Импортируем этот каталог в SVN. Аналогичным образом импортируем другие каталоги, которые собираемся отслеживать (dotnet, settings)
Если вдруг такой номер не прокатывает, открываем RepositoryBrowser и просто «Перетаскиваем» нужные каталоги в окно RepositoryBrowser
svn_rep007
В появившемся диалоговом окне проверяем адрес репозитория, и, если все нормально, жмем ОК:
svn_rep008
Каждый “перетащенный” каталог после импорта надо “обновить”, т.е. выполнить т.н. Checkout:

Обратите внимание на значения, установленные в выделенной области. Измените каталог, в котором выполняется Checkout на реальный (в данном случае v:\dotnet).
Можно пойти более простым путем – напрямую выполнить импорт нужного каталога в SVN: в контекстном меню выбрать TortoiseSVN – Import. Правда, после этого все равно придется выполнить проверку (Checkout).
Создание локальной рабочей копии на компьютере разработчика
На данный момент центральный репозиторий у нас сформирован и худо-бедно что-то в себе держит. Теперь создадим локальную рабочую копию.
Создадим каталог, например, c:\svn_work и после этого вызовем “Экспорт” из SVN-репозитория:

Проверим путь репозитория и каталог, в который выполняет экспорт репозитория. Не забываем про ревизию. Если все нормально, нажимаем ОК.
Преобразование сетевого диска в рабочую копию
Точно так же, через Export, выполняем экспорт текущего состояния центрального репозитория в сетевой диск V:. Конечно, TortoiseSVN задаст вопрос – а точно ли мы уверены, что так и надо делать? Ведь диск-то не пустой!
Отвечаем “Да”, и в результате получаем на сетевом диске рабочую копию.
Внесение изменений в центральный репозиторий
В нашей локальной рабочей копии (которая лежит в каталоге c:\svn_work) в каталоге Apps создадим новый каталог, например, \svn_test, и внутри него текстовый файлик NewTestText.txt с любым содержимым.
Обновим центральный репозиторий:

Синхронизация изменений с рабочими копиями
После внесения изменений в репозиторий необходимо их синхронизировать с другими рабочими копиями, в т.ч. и с копией, которая находится на серверном диске. Мне не удалось заставить SVN легко обрабатывать весь сетевой диск, поэтому я вручную обновлял каждый каталог, который мне требовалось: правый клик – SVN Update. После этого все изменения из центрального репозитория синхронизировались с рабочей копией.
Восстановление состояния
Допустим, сложилась ситуация, когда необходимо восстановить “все как было час / день / месяц / полгода назад”. Рассмотрим восстановление для локальной рабочей копии, т.к. для серверной все будет абсолютно аналогично.
Вариантов, как обычно, несколько: можно открыть RepositoryBrowser и восстановить оттуда, или можно восстановить по контекстному меню. Я рассмотрю только вариант работы из контекстного меню.
Итак, открываем в Проводнике нашу рабочую копию и вызываем контекстное меню.

Выбираем Update to revision.

Можно обновить до текущей версии (HEAD, значение установлено по умолчанию) либо до какой-то ревизии. В SVN каждая ревизия имеет свой порядковый номер. Поскольку удержать в памяти, какая ревизия за что отвечала, невозможно, нажимаем кнопку Show log:

В окне показывается и история всех ревизий, и изменяемые этой ревизией файлы, и пояснения. Достаточно выбрать нужную ревизию и нажать ОК. Номер ревизии автоматически скопируется в предыдущее окно. Остается нажать ОК – и все, данные восстановлены. Можно с ними работать, как будто ничего и не случилось.
Ветвление разработки
Иногда приходится ставить опасные эксперименты – меняются некоторые служебные файлы или функции, меняется алгоритм, или еще что-то. При этом хочется и исходную разработку не порушить, и эксперименты проводить достаточно безболезненно для окружающих.
Такая вещь есть, называется “ветка”, “ветвление разработки”. Грубо говоря, выполняется “снимок” текущего состояния, и этот снимок начинает собственное развитие, слабо связанное с основным направлением. Если развитие было успешным, то снимок можно “влить” обратно в основную разработку. Ну или выбросить, если результат оказался плачевным.
Создание ветки
Попробуем создать ветку. Скажу честно – по сравнению с тем же SourceTree создание ветки, и работа с ней в TortoiseSVN лично меня не впечатлила. Вообще никак.
Для создания ветки в контекстном меню выбираем TortoiseSVN – Branch / Tag:


Необходимо задать каталог, в котором будет храниться ветка. Мне кажется это не очень удачным решением, т.к. неизбежно возникнет путаница (каталог должен отличаться от того, для которого создается ветка).
Допустим, заменим каталог \Apps на \Apps_v01, укажем, что надо использовать HEAD ревизию, и чуть ниже установим обе галочки – и «Создать зависимые каталоги», и «Переключиться на новую ветку».
Для эксперимента удалим любые два каталога, и выполним обновление ветки. Получается, что ветка обновилась только на локальной рабочей копии. Обновим ветку в репозитории. Правый клик – SVN Commit. В окне Repsitory Browser можно увидеть каталог Apps и Apps_v01. Первый не претерпел никаких изменений, во втором – исчезли удаленные каталоги (скриншот я не снимал).
В любой момент можно переключиться с текущей ветки на любую другую:

В появившемся окне выбираем, на какую ветку надо выполнить переключение:

После выбора указанной ветки будет выполнено восстановление или удаление файлов и каталогов, чтобы содержимое каталогов соответствовало выбранной ветке (точнее, указанной версии).
Слияние ветки с основным направлением
Объединим ветку с основным деревом. Перед слиянием крайне желательно выполнить коммит для текущей ветки, чтобы не потерять изменения и иметь возможность к ним вернуться.

Первый вариант применяется в случае, когда вы сделали одну или несколько ревизий в ответвлении (или в основном стволе) и желаете перенести эти изменения и в другое ответвление.
Второй же – для случая, когда все изменения неделя за неделей переносились из ствола в это ответвление, и теперь, когда разработка функции завершена, вы желаете произвести её слияние обратно со стволом. Поскольку вы регулярно синхронизировали ответвление со стволом, последние версии ответвления и ствола будут полностью идентичными, за исключением ваших изменений в ответвлении. Я предпочел первый вариант.

Указываем, что надо объединять с v:, объединять все ревизии, жмем Next. В следующем окне меняем только глубину: полностью рекурсивно.

Попробуем нажать Merge и проверим результат выполнения в RepositoryBrowser. Что самое грустное – я сразу не увидел, в какой я нахожусь ветке.
Выводы
Сначала я остановился на SVN как на более простой (как мне казалось) системе. Система действительно проста, но не без недостатков:

  1. Графический клиент под Windows, удовлетворяющий всем требованиям, фактически один: TortoiseSVN.
  2. Работа с ветками показалась мне крайне неудобной и непрозрачной.

Тем не менее система отработала без малого полтора года и для начала свою задачу выполнила на 100%: а) приучила к некоторой дисциплине и б) сняла страх перед такой достаточно экзотической задачей.
Но, к сожалению, несколько последних экспериментов показали, что SVN недостаточно… как бы сказать… недостаточно гибок, маловато в нем можно сделать, используя только TortoiseSVN.

Размещено в CSV, svn, Новости, Прочее ПО · Метки: ,



Поделитесь своим мнением


Я не робот.