Команда cvs

Concurrent Versioning System (CVS) является централизованной системой контроля версий (или централизованной системой контроля ревизий). Она позволяет осуществлять коллективное написание книг, документации или кода программных проектов. Клиентские утилиты CVS доступны на множестве платформ.

Централизованная система контроля версий работает следующим образом: существует центральное файловое хранилище называемое репозиторием. Каждый участник процесса разработки может загрузить файлы проекта в локальную систему и модифицировать их по своему усмотрению. Некоторые уполномоченные участники процесса разработки могут загружать модифицированные файлы назад в репозиторий. Техническое преимущество CVS заключается во-первых в том, что в любой момент времени любому пользователю доступны все версии каждого из хранящегося в репозитории файлов. Это объясняется не тем, что в репозитории хранятся все версии каждого из файлов, а тем что в репозитории хранится информация об изменениях всех хранящихся в репозитории файлов. Во-вторых, процесс разработки является полностью прозрачным вне зависимости от того, располагается ли ваш репозиторий на удаленном сервере или на настольном компьютере.

По многим параметрам CVS отстает от такой популярной централизованной системы контроля версий, как Subversion, тем не менее, она все еще используется главным образом для хранения файлов более не развивающихся проектов. Если же вы хотите использовать систему контроля версий для своего проекта, вам стоит обратить внимание на ее более современные аналоги, такие, как Subversion, Mercurial или Git.

Примеры использования

Настройка сервера

Для максимального упрощения процесса настройки сервера следует воспользоваться соответствующим модулем системы управления сервером Webmin.

Создание репозитория

Для создания и инициализации репозитория /cvstest следует выполнить команду:

$ cvs -d /cvstest init

Получение доступа к репозиторию

Перед тем, как вы сможете сделать что-либо, вам придется сообщить CVS о расположении интересующего вас репозитория. Для этой цели следует использовать параметр -d. Например, вы можете использовать следующий формат команды, если репозиторий располагается на локальной машине в директории /usr/local/cvs (стандартная директория для CVS):

$ cvs -d /usr/local/cvs <команда cvs>

Также вы можете использовать переменную окружения CVSROOT для того, чтобы постоянно не использовать параметр -d. Например, вы можете загрузить файлы из того же репозитория с помощью данной последовательности команд:

$ export CVSROOT=/usr/local
$ cvs co cvs

В большинстве случаев, однако, репозиторий расположен на отдельной машине, поэтому доступ к нему должен осуществляться по сети. CVS позволяет осуществлять сетевой доступ к репозиторию с использованием нескольких методов; выбор метода зависит главным образом от требований к безопасности данных, хранящихся в репозитории.

В случае использования удаленного репозитория вам также придется указать его адрес, что сделает команду немного длиннее. Вы должны будете указать метод доступа к репозиторию, выделив его с обеих сторон символами двоеточия, после чего ввести имена пользователя и сервера (объединенные с помощью символа @), добавить еще один разделитель в виде двоеточия и закончить путем к директории репозитория на сервере.

Пример команды для получения доступа к репозиторию с использованием метода pserver (расшифровывается как «password-authenticated-server» или «сервер-с-доступом-по-паролям»):

$ cvs -d :pserver:jrandom@cvs.foobar.com:/usr/local/cvs login
(Вход на сервер jrandom@cvs.foobar.com)
CVS password: (здесь должен быть введен ваш пароль CVS)

Примечание: для анонимного доступа к содержимому репозитория CVS вам также придется вводить имя пользователя и пароль, которые должны быть опубликованы его владельцем.

Команда для загрузки файлов проекта cvs checkout работает именно так, как вы представляете:

$ cvs checkout myproj
cvs checkout: Updating myproj
U myproj/README.txt
U myproj/hello.c
cvs checkout: Updating myproj/a-subdir
U myproj/a-subdir/whatever.c
cvs checkout: Updating myproj/a-subdir/subsubdir
U myproj/a-subdir/subsubdir/fish.c
cvs checkout: Updating myproj/b-subdir
U myproj/b-subdir/random.c
$ ls
myproj/      was_myproj/
$ cd myproj
$ ls
CVS/        README.txt  a-subdir/   b-subdir/   hello.c