Управление хаосом или TortoiseSVN

Данная статья посвящена моему знакомству с клиентом TortoiseSVN под WIndows. В сети много информации на эту тему (в частности, отличнейшая документация на русском), но для себя я решил сделать небольшую шпаргалку, так как некоторые вещи даже после прочтения подробного мануала были не очевидны. Для начала, немного теории.

Что такое TortoiseSVN?

Это самый популярный клиент для управления версиями при разработке ПО. Вообще, SVN, согласно Википедии, это свободная централизованная система управления версиями, официально выпущенная в 2004 году компанией CollabNet. Версии в TortoiseSVN называются ревизиями. Можно в любой момент откатиться к любой из ревизий, посмотреть кто и какие изменения сделал, кто в команде больше всего работал над какими файлами работал и так далее.

Принцип простой – есть централизованное хранилище, в него импортируется проект (папка с файлами), из хранилища выделяется рабочая копия, автор как-то с ней работает, затем делает Commit и номер ревизии увеличивается на единицу. Можно откатиться к любой ревизии из хранилища.

Устанавливается как расширение проводника, а не как отдельная программа, и выглядит следующим образом.

1

Что такое ревизии?

Согласно документации, ревизии это серии массивов деревьев. Наш проект растет и эти деревья тоже.

Каждое дерево – это «снимок» состояния хранилища после каждой фиксации

22

Как работает TortoiseSVN?

TortoiseSVN не зависит от языка, на котором вы пишите. Он просто сравнивает файлы.

Если работает один разработчик – то центральным хранилищем можно сделать любую папку на HDD или сетевом диске, нужно просто выбрать папку и выбрать в контекстном меню Create Repository Here. И у нас создастся хранилище, в которое мы сможем импортировать наши проекты. Чуть позже посмотрим на примерах. Можно конечно и сервер поднять, например VisualSVN, и центральное хранилище сделать на нём, но об этом позже. Тут от целей и задач зависит.

Если разработчиков несколько и все они разбросаны по разным уголкам планеты, то тогда, конечно, лучше использовать клиент-серверную модель. Поднять сервер, например VisualSVN, настроить хранилище на нём и тогда Commit, сделанный одним разработчиком виден другим.

Общий принцип. 

Импортируем наш проект в хранилище, в папку trunk. Trunk – это ствол дерева – основное направление развития нашего проекта.

Выделяем копию из хранилища. Работаем с ней, жмём Commit. Изменения сохраняются в центральном хранилище.

Модели слияния и блокировки

Модель слияния

При работе у нас появилась идея сделать какую-то фишку в проекте.

В хранилище создаем ветвь (branch) из папки trunk. Теперь у нас в хранилище 2 одинаковые копии проекта.

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

Продолжаем работать над стволом. Модель слияния позволяет работать нескольким разработчикам одновременно. Далее, мы посмотрим как технически работать с моделью слияния.

Модель блокировок

Блокируем файл или группу, с которым мы должны работать.

Никто не имеет доступа к нему, пока он не заблокирован.

После того как поработали с файлом – разблокируем его. Главное не забыть – в этом-то вся и проблема модели блокировок))) Ну и ещё одна проблема – все ждут друг друга.

Практика

Создание репозитория

Создадим на диске С:\ папку SVN, а внутри неё сделаем ещё одну папку, назовем её Repository. Теперь нажмем правой клавишей мыши на этой папке и в контекстном меню выберем Create Repository Here таким образом

2

Нажмём Create Folder Structure

3

А потом Start Repo Browser, в результате мы увидим вот такую структуру папок

4

trunk – это ствол дерева, основное развитие проекта, сюда поместим проект при первоначальном импорте в хранилище.

branches – это ответвления, когда у нас появится какая-то идея, мы всегда можем сделать ответвление – поработать с ним, и в конце сделать слияние с trunk, и удалить ненужные файлы из branch, так как изменения уже будут закреплены.

tags – это как фотографии, нам нужно зафиксировать состояние проекта на какой-то момент, например релиз 1.0, используем это в tags.

Чуть позже увидим как со всем этим расправляться технически.

Создание папки-источника

Чтобы далеко не ходить – создадим в папке SVN – другую папку, например MyProject (Source Folder)

5

 

Теперь внутри папки MyProject (Source Folder) создадим какую-нибудь структуру, например вот так

6

 

В текстовом файле напишем, произвольный текст, например вот так…

7

 


Импорт папки-источника в репозиторий

В принципе папка-источник у нас готова, теперь импортируем её в репозиторий.

8

 

Здесь обязательно подпишите комментарий, потом, когда таких транзакций будет миллион, и мы все их будем просматривать в логе – это очень сильно пригодится. А если будет миллион безликих транзакций, то считай и потерялись. Как видите – первоначальный импорт делаем в trunk.

Здесь, смотрите, я для примера взял просто file:///C:/SVN/Repository/trunk, но в реальной жизни у нас десятки проектов, и поэтому тут можете варьировать, либо file:///C:/SVN/Repository/Project1/trunk либо file:///C:/SVN/Repository/trunk/Project1 – на вкус и цвет как говорится. В документации советуют второй вариант.

 

9

 

10

Теперь если зайдем в Repo-Browser, то увидим следующую картину

12

 


Создание рабочей копии

Создадим папку MyWorkCopy

13

 

Делаем SVN Checkout

14

 

Далее выберем директорию из которой мы будем копировать файлы

 

15

И в результате получим вот такой результат

16

Обратите внимание – появился маленький зеленый значок! Он означает, что на данный момент рабочая копия синхронизирована с хранилищем. Если этого значка у Вас нет, то возможно стоит залезть в реестр и поправить приоритет в ShellIconOverlayIdentifiers. Здесь проблема в том,что в Windows число этих значков ограничено и нужно, чтобы Tortoise был на первом месте – тогда всё будет работать. Если не поможет – посмотрите ещё в сети – много статей на тему решения этой проблемы.

18

17


Работа с рабочей копией

Сделаем какие-то изменения в нашем файле, в нашей рабочей копии.

19

Закроем файл и посмотрим на него – иконка изменилась!!! Это означает, что файл не синхронизирован с хранилищем.

20

Как сделать синхронизацию? Очень просто.

21

Откроется диалог – обязательно подписываем комментарий к коммиту.

22

В результате изменения произошли. Ревизия получила номер 3.

23

Теперь значок снова зеленый – значит синхронизация прошла успешно.

24


 

 

Просмотр журнала и управление изменениями.

Теперь, к контекстном меню Tortoise на папке MyWorkFolder жмем ShowLog

25

 

И видим следующую картину.

26


 

Просмотр изменений

Посмотрим какие изменения мы внесли по сравнению с предыдущей версией, для этого зайдем в C:\SVN\MyWorkCopy\SomeFolder и в контекстном меню выберем следующее

27

 

И увидим примерно такую картину

28

 

Когда изменений в сроке не было, она не подсвечивается цветом, то есть мы будем видеть такую картинку

35

 


Откат к предыдущим изменениям

Идем в C:\SVN, жмем правой кнопкой мыши на MyWorkCopy – жмем ShowLog

29

 

Далее выбираем ревизию и выбираем откат

30

 

Выплывет вот такое окно, в котором жмем Revert

31

 

32

 

После того как мы сделали откат – то увидим, что строки SomeChanges нет в файле SomeFile.txt И кроме того – мы сделали изменения в рабочей копии – и они не соответствую теперь хранилищу. Поэтому, чтобы закрепить эти изменения – нужно сделать Commit.

33

 

Делаем Commit изменений в хранилище – после чего получим зеленую галочку.

34

 

Просматривать лог и делать коммиты можно на разных уровнях. Можно на уровне файлов или папок – тут всё зависит от Ваших текущих задач.

 

Думаю данный пост завершить, так как он получился слишком длинным. В следующем посте хочу осветить правильный цикл слияния.

Мы изучили теорию – на минимальном уровне.

Мы разобрали как создать хранилище.

Мы создали рабочую копию из хранилища, сохранили изменения, посмотрели лог и откатились обратно. В принципе, это типичные действия для разработчиков.

This entry was posted in SVN, Без рубрики. Bookmark the permalink.