Содержание
Статья в процессе дополнения.
Для начала расскажу немного о таком продукте коллективного ума, как Subversion. Эта система контроля версий, позволяет вносить изменения в проект поэтапно, учитывая различные варианты модификации файлов.
На самом деле можно использовать практически в любой сфере программирования, веб разработки, написания текстов и т.д.
Суть её заключается в том, что имеется некоторое хранилище информации, с которым могут работать локальные и удаленные пользователи, при этом каждый может вносить свои изменения в файлы. И в процессе разработки эти изменения либо вырастают в устойчивые версии, либо “отмирают”, таким образом делая процесс написания большого проекта весьма продуманным и надежным.
Больше не потребуется вспоминать, какие изменения были сделаны в пятницу на прошлой неделе и почему именно такие. Больше не нужно будет думать кто именно исправил три бага в программе, но внёс ещё четыре своим хитрым кодом. Можно откатывать изменения на предыдущие версии, вести параллельную разработку и доступно комментировать свою работу для коллег.
Интересно? Продолжаем.
Настройки серверной части
Устанавливаем пакет subversion из командной строки:
# yum -y install subversion
После того, как приложение будет установлено, создадим каталог для хранения всех репозиториев. У меня это будет /var/svn, но вы можете выбрать произвольный путь (внося соответствующие правки во все команды далее по тексту):
# mkdir /var/svn
Далее создадим новый репозиторий командой svnadmin. Допустим, мы делаем совместный проект над каким-либо сайтом www.aaa.ru. Не будем мудрствовать лукаво, создадим репозиторий прямо в таком виде:
# svnadmin create /var/svn/www.aaa.ru
Попутно можно вывести информацию о репозитории, командой svn info, указав протокол доступа к хранилищу. Для локального хранилища подойдёт протокол file://
Какую информацию можно подчерпнуть отсюда? Прежде всего – полный путь к репозиторию, номер ревизии (версии). То есть каждый раз при изменении какого-либо файла в хранилище меняется и номер, увеличиваясь на единицу. А так же здесь фигурирует дата последнего изменения. Пожалуй, это для нас будут основные поля.
Идём дальше. Репозиторий создан. Пора добавить в него хоть какие-нибудь файлы.
Создадим временный каталог test с одним единственным файлом index.php, следующего содержания:
<?php
// main file
?>
Импортируем этот каталог в наш репозиторий. Обратите внимание, используется команда:
# svn import test file:///var/svn/www.aaa.ru -m "Index file"
где test – имя нашего каталога, содержимое которого помещается в хранилище; далее идёт указание самого хранилища, а так же присутствует ключ -m с комментарием. Все комментарии учитываются, чтобы потом можно было вспомнить что и зачем менялось в конкретной ревизии, поэтому рекомендуется давать осмысленные и грамотные пояснения своим действиям.
Видим сообщение
Adding test/index.php
Committed revision 1.
Это значит, что добавился файл test/index.php, а номер ревизии сменился на 1.
Если мы повторим команду запроса info, то увидим, что наши изменения ревизии учитываются.
Как работать с клиентов Linux
Для того, чтобы работать с клиентов на базе OS Linux, нужно будет установить пакет subversion (см. начало статьи), поскольку оно включает в себя как сервер, так и клиент. (P.S. Существую и графические приложения, я уверен, но сейчас речь о консоли)
Итак, предположим, что для своей работы мы выбрали протокол ssh, как достаточно безопасный.
Получим файлы с нашего репозитория в рабочую копию. Рабочей копией называется локальная копия репозитория, в которой производятся все изменения. По окончании правок эта копия закачивается обратно в хранилище (Коммит), при этом увеличивая ревизию и обновляя файлы в каталогах.
Не забываем поднять SSH на сервере с репозиторием!
$ svn co svn+ssh://dmitry@192.168.1.104/var/svn/www.aaa.ru
co – checkout – означает копирование репозитория в рабочий каталог.
При этом у нас дважды спросят пароль пользователя dmitry (в дальнейшем мы это уберем).
Нетрудно заметить, что создалась локальная папка www.aaa.ru с содержимым репозитория.
Я немного изменил код файла (см.ниже вывод команды cat index.php
). И закоммитил изменения с комментарием “Add 3 line“. Опять же введя пароль это удалось сделать.
Честно говоря, надоело вводить пароль постоянно. Сгенерирую ключи SSH:
$ ssh-keygen -t rsa
на предложение ввести парольную фразу отвечу пустым паролем. Затем импортирую публичный ключ на удаленный сервер:
$ ssh-copy-id -i /home/dmitry/.ssh/id_rsa.pub dmitry@192.168.1.104
Здесь потребуется один раз ввести пароль от удаленной учетки dmitry, чтобы удостовериться, что мы можем добавлять в неё ключи.
Теперь, как мы можем проверить, пароль не спрашивается при закачке репозитория и коммитах. Намного удобнее и быстрее.
Если вдруг нужно добавить новый файл – это делается командой import (как мы выше создавали файл index.php на сервере), аналогичным образом импортируем каталог ТОЛЬКО с теми файлами, которых на сервере нет.
Допустим:
Иначе, можно просто создать новый файл в нашем временном рабочем каталоге и добавить его в репозиторий так:
$ svn add <имя файла>
$ svn commit
Будет точно так же закачан файл и обновлена ревизия.
Этими функциями subversion не ограничивается. Всегда можно посмотреть полный список так:
$ svn help
Кстати, здесь я предлагаю схитрить. Если мы постоянно работаем в консоли и используем один и тот же путь к репозиторию (вы заметили, что неудобно набивать его руками каждый раз?), можно создать переменную окружения для удобства. А то и вообще потом поместить её в свой стартовый файл оболочки:
$ repo='dmitry@192.168.1.104/var/svn/www.aaa.ru'
$ svn log svn+ssh://$repo
Намного удобнее использовать. Кстати, команда log показывает всю историю изменений репозитория:
Посмотреть изменения между различными ревизиями можно так:
Поясняю. + перед строкой – означает, что она добавилась. – что исчезла.
Работа с Subversion с клиентами по Windows
Есть много хорошего софта. Наиболее популярен тут TortoiseSVN, бесплатный.
Подключаем наш репозиторий:
Далее вводим аутентификационные данные (пока не добавили ключ Windows машины) и увидим наш репозиторий:
Пункты меню – аналогичные. Делаем Чекаут (загрузку репо в каталог), меняем файл. Делаем коммит и готово!
На самом деле эта система просто идеальна для программистов, совместно работающих над каким-нибудь крупным проектом, поскольку позволяет распределить рабочую область на нескольких людей, отслеживать версии и изменения.
Кроме того, существует возможность не просто сравнивать между собой несколько ревизий, но ещё и откатывать изменения обратно, объединять ревизии в окончательный билд, игнорируя определенные сборки, но включая изменения внесенные на других этапах. В общем весьма гибкая система, заслуживающая внимания.
SVN классная тема для веб-разработчиков, работающих совместно над одним сайтом. Или программистов. Одним словом тех, кто работает с текстами.
Интересно, есть системы совместной работы над документами?