CVS - (
Concurrent Versions System, "Система Конкурирующих Версий" ) — программное решение из класса "систем управления версиями" (version control system). Содержит историю изменений определенного набора файлов, являющихся как правило исходниками какого-то програмного проекта. Позволяет вести совместную работу над проектом, группе людей.
Настройка CVS сервера
Подготовка CVS
Для начала нужно решить, где будет лежать основное хранилище и создать для него корневую директорию. Например
/usr/local/cvs:
# mkdir -p /usr/local/cvs
# setenv CVSROOT /usr/local/cvs # Установить для переменной CVSROOT расположение корня (local)
# cvs init # Создать все внутренние конфиги CVS
# cd /root
# cvs checkout CVSROOT # Оформить рабочее дерево каталогов
# cd CVSROOT
edit config ( fine as it is)
# cvs commit config
cat >> writers # Создать файл writers, содержащий пользователей с правами на запись/изменение (опционально, файл readers)
colin
^D # Используя Ctrl+D, выйти из режима редактирования
# cvs add writers # Добавить разработчиков в репозитарий
# cvs edit checkoutlist
# cat >> checkoutlist
writers
^D # Используя Ctrl+D, выйти из режима редактирования
# cvs commit # Передать все сделанные изменения
Есть два способа разграничить права на чтение и запись репозитария. Включающий способ означает, что пользователи, имеющие права на чтение репозитария, явно указываются в файле
readers. Исключающий способ означает, что права на запись репозитария, имеют только пользователи перечисленные в файле
writers, остальные только на чтение.
Есть три способа получить доступ к репозитарию. Два первых не нуждаются в каком-либо дополнительном изменении конфигурации.
- Локальный доступ к файловой системе. Пользователь должен иметь достаточно прав для досткпа к CVS, ему достаточно авторизоваться в системе. Этот способ используется только для локального хранилища.
- Удаленный доступ через SSH туннель. Пользователь должен иметь SSH аккаунт и права на чтение/запись на CVS сервере. Это не требует запуска дополнительных процессов на CVS сервере, авторизация проходит через SSH соединение.
- Удаленный доступ с помощью pserver (порт по-умолчанию: 2401/tcp). Этот способ предпочтителен для большого кол-ва пользователей, авторизация проходит через pserver, пароли хранятся в отдельной базе данных, при этом нет надобности в локальных аккаунтах. Настройки данного способа приведены ниже.
Сетевые настройки с помощью inetd
CVS можно запустить локально, только если нет надобности в сетевом доступе. Для удаленного доступа, демон
inetd, файл
/etc/inetd.conf (
/etc/xinetd.d/cvs в
SuSE), запускает
pserver:
cvspserver stream tcp nowait cvs /usr/bin/cvs cvs --allow-root=/usr/local/cvs pserver
Неплохой идеей будет заблокировать порт
CVS от прямого доступа из внешнего мира с помощью
firewall и использовать
SSH туннель.
Раздельная авторизация
Иногда может понадобиться, завести не локальных пользователей. Для этого просто добавте файл
passwd, содержащий имена пользователей и пароли в зашифрованном виде, в директорию
CVSROOT. Сделать это можно, например с помощью утилиты веб
сервера Apache,
htpasswd.
Файл passwd можно редактировать напрямую, в директории CVSROOT. Для получения справки, используйте, htpasswd --help
# htpasswd -cb passwd user1 password1 # -c, создать файл паролей
# htpasswd -b passwd user2 password2
Теперь допишите
:cvs, в конец каждой строки файла, что-бы
CVS менял пользователя, от имени которого он запускается. Примерно так:
# cat passwd
user1:xsFjhU22u8Fuo:cvs
user2:vnefJOsnnvToM:cvs
Проверка работоспособности CVS
Попробуйте зайти с именем существующего пользователя:
# cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs login
Logging in to :pserver:colin@192.168.50.254:2401/usr/local/cvs
CVS password:
Переменная CVSROOT
Это переменная окружения, использующаяся для определения места хранения репозитария. Для локального использования, она может быть установлена в директории репозитария. Для сетевого доступа, должен быть определен транспортный протокол. Установите переменную
CVSROOT, командой,
setenv CVSROOT строка (для оболочек
csh и
tcsh), или export
CVSROOT=string ( для оболочек
sh или
bash ).
# setenv CVSROOT :pserver:@:/cvsdirectory
# setenv CVSROOT /usr/local/cvs # Только для локального использования
# setenv CVSROOT :local:/usr/local/cvs # То-же, что и выше
# setenv CVSROOT :ext:user@cvsserver:/usr/local/cvs # Прямой доступ по протоколу SSH
# setenv CVS_RSH ssh # Для ext доступа
# setenv CVSROOT :pserver:user@cvsserver.254:/usr/local/cvs # Для сети, через pserver
После авторизации в системе, можно импортировать новый проект:
Перейдите в корневую директорию проекта
cvs import
cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs import MyProject MyCompany START
Где,
MyProject, имя вашего нового проекта в репозитарии ( потом используется для проверки ).
CVS импортирует текущее содержимое директории в проект.
Проверяем:
# cvs -d :pserver:colin@192.168.50.254:/usr/local/cvs checkout MyProject
или
# setenv CVSROOT :pserver:colin@192.168.50.254:/usr/local/cvs
# cvs checkout MyProject
SSH туннель для CVS
Нам понадобится 2 оболочки. Из первой мы подключимся к CVS серверу по протоколу SSH и настроим форвардинг портов. Из второй оболочки будем подключаться к
CVS, как будто он запущен на локальной машине.
Оболочка 1:
# ssh -L2401:localhost:2401 colin@cvs_server # Прямое подключение к CVS серверу, или:
# ssh -L2401:cvs_server:2401 colin@gateway # Используйте шлюз
Оболочка 2:
# setenv CVSROOT :pserver:colin@localhost:/usr/local/cvs
# cvs login
Logging in to :pserver:colin@localhost:2401/usr/local/cvs
CVS password:
# cvs checkout MyProject/src
Основные команды CVS
Import
Команда
Import, используется для добавления целой директории, вызывается из директории, которую нужно импортировать. К примеру, директория
/devel/ содержит файлы и поддиректории для импорта. Директория в
CVS, будет "
myapp".
# cvs import [options] directory-name vendor-tag release-tag
# cd /devel # Войти в директорию проекта для импорта
# cvs import myapp Company R1_0 # Release tag может быть любым словом
После добавления новой директории, например
/devel/tools/, ее так-же можно импортировать.
# cd /devel/tools
# cvs import myapp/tools Company R1_0
Checkout update add commit
# cvs co myapp/tools # Проверка только директории tools
# cvs co -r R1_1 myapp # Проверит "myapp", релиз R1_1
# cvs -q -d update -P # Типичное обновление CVS
# cvs update -A # Сбросить sticky tag
# cvs add newfile # Добавить файл
# cvs add -kb newfile # Добавить бинарный файл
# cvs commit file1 file2 # Передать только 2 файла
# cvs commit -m "message" # Передать все изменения, сделанные в сообщении
Создание патча
Создавать патч, предпочтительней, из рабочей директории проекта или из исходников.
# cd /devel/project
# diff -Naur olddir newdir > patchfile # Создать патч из директории или файла
# diff -Naur oldfile newfile > patchfile
Применение патча
Иногда может понадобится отделить уровни директорий для патча, в зависимости от того, как он был создан. В случае затруднений, можно просто посмотреть первую строку в файле патча и попробовать варианты:
-p0,
-p1 или
-p2.
# cd /devel/project
# patch --dry-run -p0 < patchfile # Проверить патч, не применяя его
# patch -p0 < patchfile
# patch -p1 < patchfile # Отделить один уровень от пути