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