Пример работы с CVS

В качестве введения в CVS мы приведем здесь типичную сессию работы с CVS. Первое, что необходимо понимать, это то, что CVS хранит все файлы в централизованном репозитории (см. Глава 5. Репозиторий); в этой главе предполагается, что репозиторий настроен.

Предположим, что вы работаете над простым компилятором. Исходный текст состоит из нескольких C-файлов и Makefile'а. Компилятор называется 'tc' (Тривиальный Компилятор), а репозиторий настроен так, что имеется модуль tc.

Получение исходного кода

Сначала вам надо получить рабочую копию исходного кода для tc. Используйте команду

$ cvs checkout tc

при этом будет создан каталог tc, в который будут помещены все файлы с исходными текстами.

$ cd tc
$ ls
CVS Makefile backend.c driver.c frontend.c parser.c

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

Вы запускаете свой любимый редактор, работаете над backend.c и через пару часов вы добавили фазу оптимизации в компилятор. Замечание для пользователей RCS и SCCS: не требуется блокировать файлы, которые вы желаете отредактировать.

Фиксирование изменений

После того, как вы проверили, что компилятор все еще компилируется, вы решили создать новую версию файла backend.c. При этом в репозитории появится ваш новый файл backend.c, который станет доступным всем, использующим этот репозиторий.

$ cvs commit backend.c

CVS запускает редактор, чтобы позволить вам ввести журнальную запись. Вы набираете “Добавлена фаза оптимизации”, сохраняете временный файл и выходите из редактора.

Переменная окружения $CVSEDITOR определяет, какой именно редактор будет вызван. Если $CVSEDITOR не установлена, то используется $EDITOR, если она, в свою очередь, установлена. Если обе переменные не установлены, используется редактор по умолчанию для вашей операционной системы, например, vi под UNIX или notepad для Windows 95/NT.

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

Когда CVS запускает редактор, в шаблоне для ввода журнальной записи перечислены измененные файлы. Для клиента CVS этот список создается путём сравнения времени изменения файла с его временем изменения, когда он был получен или обновлен. Таким образом, если время изменения файла изменилось, а его содержимое осталось прежним, он будет считаться измененным. Проще всего в данном случае не обращать на это внимания — в процессе фиксирования изменений CVS определит, что содержимое файла не изменилось и поведет себя должным образом. Следующая команда update сообщит CVS, что файл не был изменен, и его время изменения будет возвращено в прежнее значение, так что этот файл не будет мешаться при дальнейших фиксированиях.

Если вы хотите избежать запуска редактора, укажите журнальную запись в командной строке, используя флаг -m, например:

$ cvs commit -m “Добавлена фаза оптимизации” backend.c

Уборка за собой

Перед тем, как перейти к другим занятиям, вы решаете удалить рабочую копию tc. Конечно же, это можно сделать так:

$ cd ..
$ rm -r tc

но лучшим способом будет использование команды release:

$ cd ..
$ cvs release -d tc
M driver.c
? tc
You have [1] altered files in this repository.
Are you sure you want to release (and delete) directory 'tc': n
** 'release' aborted by user choice.

Команда release проверяет, что все ваши изменения были зафиксированы. Если включено журналирование истории, то в файле истории появляется соответствующая пометка.

Если вы используете команду release с флагом -d, то она удаляет вашу рабочую копию.

В вышеприведенном примере команда release выдала несколько строк. ? tc означает, что файл tc неизвестен CVS. Беспокоиться не о чем, tc — это исполняемый файл компилятора, и его не следует хранить в репозитории.

M driver.c — более серьезное сообщение. Оно означает, что файл driver.c был изменен с момента последнего получения из репозитория.

Команда release всегда сообщает, сколько измененных файлов находится в вашей рабочей копии исходных кодов, а затем спрашивает подтверждения перед удалением файлов или внесения пометки в файл истории.

Вы решаете перестраховаться и отвечаете n RET, когда release просит подтверждения.

Просмотр изменений

Вы не помните, что изменяли файл driver.c, поэтому хотите посмотреть, что именно случилось с ним.

$ cd tc
$ cvs diff driver.c

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

$ cvs commit -m “Добавлена фаза оптимизации” driver.c
Checking in driver.c;
/usr/local/cvsroot/tc/driver.c,v <-- driver.c
new revision: 1.2; previous revision: 1.1
done
$ cd ..
$ cvs release -d tc
? tc
You have [0] altered files in this repository.
Are you sure you want to release (and delete) directory 'tc': y