Здесь я опишу основы работы с SubVersion в Mac OS X, начиная от создания репозитория и заканчивая редактированием и обновлением версий.
Subversion (также известная как «SVN») — свободная централизованная система управления версиями, официально выпущенная в 2004 году компанией CollabNet Inc.
Модель работы
Subversion — централизованная система (в отличие от распределённых систем, таких как Git или Mercurial), то есть данные хранятся в едином хранилище. Хранилище может располагаться на локальном диске или на сетевом сервере.
Работа в Subversion мало отличается от работы в других централизованных системах управления версиями. Клиенты копируют файлы из хранилища, создавая локальные рабочие копии, затем вносят изменения в рабочие копии и фиксируют эти изменения в хранилище. Несколько клиентов могут одновременно обращаться к хранилищу. Для совместной работы над файлами в Subversion преимущественно используется модель копирование — изменение — слияние. Кроме того, для файлов, не допускающих слияние (различные бинарные форматы файлов), можно использовать модель блокирование — изменение — разблокирование.
При сохранении новых версий используется дельта-компрессия: система находит отличия новой версии от предыдущей и записывает только их, избегая дублирования данных.
Приемы работы
Открываем Терминал. Перейдем в корневую папку для данного пользователя:
1 |
$ cd ~/ |
С помощью следующей команды можно узнать путь к этой и любой другой папке:
1 |
$ pwd |
Создаем репозиторий в корневой папке:
1 |
$ svnadmin create SVNrep |
Копируем начальную версию нашего проекта, предварительно узнав путь к нему, в созданный репозиторий:
1 2 |
$ svn import /Users/UserName/Desktop/ProjectName file:///Users/UserName/SVNrep/ -m "Initial import" |
Здесь после -m идет комментарий. После import идет путь к папке проекта, затем путь к репозиторию. Обратите внимание, что нужно указать еще слово file в начале пути к репозиторию. В данном случае в репозитории SVNrep будет все, что есть внутри ProjectName. Проверить это можно, перейдя к папке SVNrep и используя команду ls с параметром a1, который ознчает, что будет показано все, включая скрытые папки и файлы:
1 2 |
$ cd ~/SVNrep $ ls -a1 |
Не удивляйтесь, что кроме Ваших файлов, есть еще куча других, в том числе папка .svn во всех вложенных папках – это служебные файлы svn, которые нужны для того, чтобы каждый раз не указывать путь к репозиторию в дальнейшем. Если Вы хотите изъять теперь из репозитория копию проекта без этих файлов и создать безопасную для Web копию, через которую нельзя воздействовать на репозиторий, введите следующую команду:
1 2 |
$ svn export file:///Users/UserName/SVNrep/ /Users/UserName/Desktop/ProjectNameWebSafe |
Здесь мы создаем копию проекта без служебных файлов на рабочем столе.
Для того, чтобы создать рабочую копию репозитория SVN, введите команду:
1 2 |
$ svn checkout file:///Users/UserName/SVNrep/ /Users/UserName/Desktop/ProjectNameCopy |
Рабочая копия в отличие от Web Safe копии позволяет сохранять изменения, созданные в рабочей копии, в репозитории.
Предположим теперь, что наш репозиторий находится на сервере где-то.
Копируем наш проект(первую версию) с локального компьютера в репозиторий на сервере:
1 2 |
$ svn import /Users/UserName/Desktop/ProjectName http://HostName/svn/ProjectRepositoryName/ -m "Initial import" |
Теперь создаем рабочую копию у себя с сервера:
1 2 |
$ svn checkout http://HostName/svn/ProjectName/ /Users/UserName/Desktop/WorkProjectFolder |
Предположим мы что-то изменили в рабочей копии. Создали что-то новое, дописали что-то и хотим посмотреть на разницу между рабочей копией и репозиторием на сервере. Для этого переходим в папку проекта в Терминале и используем команду status:
1 2 |
$cd /Users/UserName/Desktop/WorkProjectFolder/ $ svn status |
Если Вы увидите, например, такой текст:
1 |
M test.txt |
это означает, что файл test.txt был модифицирован (“M” = Modified). Добавление, удаление и переименовывание объектов необходимо осуществлять специальными командами.
Теперь нужно сделать Commit произведенных в рабочей копии изменений, чтобы они отразились на сервере в репозитории:
1 |
$ svn commit -m "Added and removed some test files" |
После добавления, удаления и переименовывания нужно также делать commit.
Предположим, что пока вы работали с рабочей копией, кто-то успел добавить новые файлы в Ваш проект. Чтобы обновить рабочую копию, нужно использовать команду update. Здесь пример с результатом update, как пример – восстановлена фотография.
1 2 3 |
$ svn update Restored 'Medicine/Снимок экрана 2011-12-02 в 17.42.18.png' At revision 11. |
Чтобы просмотреть все Revisions, используем команду log. При этом отображается число строк измененных и комментарии:
1 |
$ svn log |
Чтобы просмотреть только измененные строки в сорс-файлах в определенном Revision (версии), используем следующий синтаксис:
1 |
$ svn diff -r 1 |
Если Вы захотите откатиться к предыдущей версии (любой), делаем update, но только указываем еще номер Revision (версии):
1 |
$ svn update -r 1 |
Этот update подействует на весь проект. Но если вы хотите проапдейтить определенный файл, нужно его указать:
1 |
$ svn update test.txt -r 1 |
Добавление файлов производится вручную. Недостаточно просто создать новый файл в рабочей копии и сделать commit. Нужно его еще добавить в репозиторий. Например, создаем сначала папку в нашем проекте под названием TestFolder. Затем нужно ее прописать в SVN и сделать commit, чтобы она появилась в репозитории на сервере:
1 2 3 4 5 |
$ svn add TestFolder A TestFolder $ svn commit -m "added new folder TestFolder" Adding TestFolder Committed revision 12. |
Аналогично производится удаление:
1 2 |
$ svn delete test2.txt $ svn commit -m "deleted file" |
И переименовывание:
1 2 |
$ svn move oldfilename newfilename $ svn commit -m "moved file" |
Удаление и переименовывание не нужно делать в Finder. Эти команды сами удаляют и переименовывают как в рабочей копии, так и в репозитории.
Если возникает конфликт при commit’е, нужно сначала сделать update, а затем commit. При этом SVN строчка за строчкой сам добавляет недостающие строки в Вашу копию.
1 2 3 4 |
$ svn commit -m "Some change by Michael" Sending test.txt svn: Commit failed (details follow): svn: Out of date: '/test/test.txt' in transaction '3-1' |
Если SVN не справляется с этим, то он создает копии файлов в Вашей рабочей копии проекта:
1 2 3 |
test.txt.mine test.txt.r2 test.txt.r3 |
Для удобства можно использовать графический интерфейс в SVN, например, программу SCToolbarButton.
Ссылки для изучения:
http://www.rubyrobot.org/tutorial/subversion-with-mac-os-x – хорошая статья на эту же тему на английском языке