in Профессиональное

Subversion на CentOS 4.x/5.x и RHEL 4/5. Часть 2 – работа с Subversion

По мотивам вики 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 – установка и настройка.

Write a Comment

Comment

ERROR: si-captcha.php plugin: GD image support not detected in PHP!

Contact your web host and ask them to enable GD image support for PHP.

ERROR: si-captcha.php plugin: imagepng function not detected in PHP!

Contact your web host and ask them to enable imagepng for PHP.