По мотивам вики centos – статья в двух частях про Subversion (http://wiki.centos.org/HowTos/Subversion).
Часть вторая, в которой рассматриваются вопросы работы с SVN для начинающих:
Использование Subversion
Структура репозитория Subversion
Если все предыдущие шаги пройдены успешно, то вы готовы к использованию вашего репозитория. В комлекте Subversion поставляется интерфейс для командной строки, который так и называется: svn.
# Получить справку по использованию [root@name] svn --help
Основные команды, которые вам нужно знать это svn import (импорт исходников в репозиторий), svn commit (ci) (обновление репозитория с учетом сделанных вами изменений), и svn checkout (co) (загрузка рабочей копии файлов к вам на локальную машину или в локальную директорию). Итак, сначала import чтобы поместить исходники в svn, затем checkout чтобы получить полную актуальную версию и наконец, после правок и изменений – commit для сохранения внесенных вами изменений.
Перед тем как мы продолжим, несколько слов о структуре репозитория. Едва ли не все источники говорят о создании определенной структуры директорий в репозитории. В особенности они отмечают что необходимо создать директории branches, tags, и trunk в корневой директории репозитория. Например:
. |-- project1 | |-- branches | |-- tags | `-- trunk `-- project2 |-- branches |-- tags `-- trunk
Далее в литературе описано как организовать работу с таким репозиторием. Надо сказать что такая структура не является обязательной и если у вас не очень сложный проект вы можете ей не следовать.
От переводчика. К слову сказать, я работал как с описанной в литературе структурой, так и без нее. Собственно если разработчиков 1-3, можно обойтись без усложнения процедур и репозитория. Если команда 5 и более человек, проект быстро растет и развивается, то заранее надо подумать о том как будут работать 10, 20 или даже 100 разработчиков.
В качестве примера, создадим тестовые директории и несколько файлов в них.
[root@name] cd /tmp [root@name] mkdir mytestproj [root@name] cd mytestproj [root@name] mkdir configurations options main [root@name] vim configurations/testconf1.cfg [root@name] vim options/testopts1.cfg [root@name] vim main/mainfile1.cfg
Имейте в виду, что вы можете создать любую нужную вам структуру директорий. Когда у вас есть структура проекта и несколько файликов, мы можем приступить к импортированию их в репозиторий.
Импорт в Subversion
[root@name] svn import /tmp/mytestproj/ file:///var/www/svn/repos/mytestproj -m "Initial repository layout for mytestproj" Adding /tmp/mytestproj/main Adding /tmp/mytestproj/main/mainfile1.cfg Adding /tmp/mytestproj/configurations Adding /tmp/mytestproj/configurations/testconf1.cfg Adding /tmp/mytestproj/options Adding /tmp/mytestproj/options/testopts1.cfg
На самом деле импортировать можно не только через file:///var/www/svn/repos/mytestproj (этот прием подразумевает что репозиторий и ваши файлы находятся на одном сервере), но и указывая URL: http://yoursvnserver/repos/mytestproj. Этот же URL будет использован для выгрузки далее.
Выгрузка из Subversion
Теперь, легким движением руки… о чем это я… )) В общем давайте заберем из репозитория то что мы туда положили. Но сперва откройте в браузере http://yourmachine/repos. Однажды импортировав проект в SVN, вы можете использовать его на любой другой машине. Для соединения с репозиторием, вы также будете использовать аккаунт пользователя, созданного в первой части данной статьи:
[root@name] cd /tmp [root@name] svn co http://yoursvnserver/repos/mytestproj Authentication realm: <http://yoursvnserver:80> Subversion repos Password for 'youruser': A mytestproj/main A mytestproj/main/mainfile1.cfg A mytestproj/configurations A mytestproj/configurations/testconf1.cfg A mytestproj/options A mytestproj/options/testopts1.cfg Checked out revision 1.
Правка и коммит в Subversion
На предыдущем шаге мы выгрузили 1ю ревизию нашего проекта. Теперь вы можете отредактировать что-нибудь и закоммитить (commint) ваши правки обратно на сервер Subversion:
[root@name] cd mytestproj [root@name] vim configurations/testconf1.cfg -- Add or delete something and save. [root@name] svn commit -m "Added a line to testconf1.cfg." Sending configurations/testconf1.cfg Transmitting file data . Committed revision 2.
От переводчика: обратите внимание, с ключом -m добавляется текстовый комментарий (в данном случае “Added a line to testconf1.cfg.”). Комментарий не является обязательным, но я рекомендую не пренебрегать данной возможностью, это очень облегчает понимание изменений сделанных ранее другим разработчиком или вами, но несколько месяцев назад. Об этом еще будет сказано ниже.
В общем-то теперь вы можете удалить локальные файлы, так как правку вы внесли и закоммитили. Теперь ваши изменения можно посмотреть через браузер в репозитории. Тем не менее как правило так не делают, так как работают с файлами проекта несколько дней, недель, а то и месяцев.
Добавление и удаление в Subversion
Теперь, когда у нас все тип-топ, неожиданно нам требуется добавить файлы в наш репозиторий. Сделать это несложо используя аргумент add. Выгружаем наш проект, копируем новые файлы, добавляем их к репозиторию и коммитим изменения:
# Выгружаем [root@name] svn co http://yoursvnserver/repos/mytestproj A mytestproj/main A mytestproj/main/mainfile1.cfg A mytestproj/configurations A mytestproj/configurations/testconf1.cfg A mytestproj/options A mytestproj/options/testopts1.cfg Checked out revision 2.
# Добавляем файл [root@name] cd mytestproj [root@name] cp /etc/yum.repos.d/CentOS-Base.repo configurations/ [root@name] svn add configurations/CentOS-Base.repo A configurations/CentOS-Base.repo
# Коммитим правку [root@name] svn commit -m "Added the CentOS Yum repo file." Adding configurations/CentOS-Base.repo Transmitting file data . Committed revision 3.
Удалить элементы также просто – только используйте delete а не add. И не забывайте коммитить изменения! Теперь, если вы зайдете через браузер в репозиторий, вы увидите что ревизия уже 3я.
Откат в Subversion
Описанное выше смотрится здорово, но что, если потребуется откатиться назад, к предыдущей версии? Это тоже несложно сделать. Если вы не уверены, какая версия вам нужна, команда log вам в помощь. Вот зачем очень желательно добавлять комментарии к каждому коммиту. Информации в комментарии не много, но достаточно для того чтобы понять что было сделано.
От переводчика: кстати полезно к комментарию добавлять номер бага или требования, по которому вносится данная правка (конечно если у вас используется багтрекинговая система или система управления требованиями), например “bug 1234: new directory added”
# Лог по всему репозиторию [root@name] svn log http://yoursvnserver/repos # Лог по выбранному проекту [root@name] svn log http://yoursvnserver/repos/mytestproj
Таким образом вы получили полный список ревизий с комментариями. На основании списка вы можете выбрать нужную вам ревизию.
# Выгрузка первой ревизии [root@name] svn co -r 1 http://yoursvnserver/repos/mytestproj
Контроль доступа (ACL)в Subversion
Зачастую, вам не потребуется разграничивать доступ пользователей к каждому репозиторию. Тем не менее, если это потребуется, то доступы пользователям можно разграничивать при помощи списков контроля доступа (ACLs). Данные списки можно подключить при помощи директивы AuthzSVNAccessFile, параметром которой служит имя файла:
# Включение ACLs AuthzSVNAccessFile /etc/svn-acl-conf
Вы можете добавить эту директиву в секцию Location, соответствующую вашему репозиторию:
DAV svn SVNParentPath /var/www/svn/repos AuthzSVNAccessFile /etc/svn-acl-conf AuthType Basic AuthName "Subversion repos" AuthUserFile /etc/svn-auth-conf Require valid-user
Теперь необходимо создать файл /etc/svn-acl-conf. Он будет содержать секции следующего вида:
[reponame:repopath] user = access
Параметр access может быть: r (read – чтение), rw (read-write – чтение-запись), или пустой (нет доступа). По умолчанию, при использовании ACLs, пользователи не имеют доступа к репозиторию. Предположим, что у нас есть репо framework, и мы хотим выдать следующие права: john – чтение, joe – чтение-запись. Это можно сделать при помощи следующей записи:
[framework:/] john = r joe = rw
Также можно создавать группы в секции groups. В дальнейшем при использовании перед именами групп ставится @, например:
[groups] staff = joe, george [framework:/] john = r @staff = rw
Если вы хотите сделать все репозитории доступными всем пользователям, вы можете добавить секцию для корневой директории каждого репо:
[/] * = r
В качестве заключения
В данной статье освещена малая часть всех возможностей, которые Subversion может вам предложить. Этот краткий курс молодого svn-бойца предназначен помочь начинающим сориентироваться как что и зачем. Пользуйтесь документацией, там содержится множество полезных фич и приемов, которые будут полезны как одному разработчику, так и большой, в том числе и распределенной географически, команде. Вы также можете использовать Subversion для своих локальных нужд, указывая file:///path/to/repo вместо того чтобы работать через apache http://yoursvnserver/repos/whatever.
Удачи! )
Что еще почитать о Subversion?
Version Control with Subversion ака svnbook: http://svnbook.red-bean.com/
P.S.
Про установку и настройку SVN вы сможете прочитать в первой части – Subversion на CentOS 4.x/5.x и RHEL 4/5. Часть 1 – установка и настройка.
Webmentions
[…] Subversion на CentOS 4.x/5.x и RHEL 4/5. […]