Алексей Махоткин

домашняя страница

CVS — Система Управления Параллельными Версиями

Go to the first, previous, next, last section, table of contents.


Добавление, удаление и переименование файлов и каталогов

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

Добавление файлов в каталог

Для того, чтобы добавить новый файл в каталог, совершите следующие шаги:

  • Сначала у вас должна быть рабочая копия каталога. See section Получение исходного кода.
  • Создайте новый файл в рабочей копии каталога.
  • Используйте `cvs add имя_файла, чтобы сообщить CVS, что вы хотите хранить историю изменений этого файла. Если в файле хранятся двоичные данные, добавьте ключ командной строки `-kb’ (see section Обработка двоичных файлов).
  • Используйте команду `cvs commit имя_файла, чтобы поместить файл в репозиторий. Другие разработчики не увидят этот файл, пока вы не выполните эту команду.

Можно также использовать команду add для добавления нового каталога.

В отличие от большинства других команд, команда add не является рекурсивной. Вы даже не можете сказать `cvs add foo/bar’. Вместо этого, вам потребуется выполнить

$ cd foo
$ cvs add bar

Команда: cvs add [-k kflag] [-m сообщение] файлы …

Добавить файлы в список на помещение в репозиторий. Файлы или каталоги, указанные в команде add, должны существовать в текущем каталоге. Для того, чтобы добавить в репозиторий целое дерево каталогов, например, файлы, полученные от стороннего поставщика, используйте команду import. See section Команда import: импортировать исходные тексты.

Добавленные файлы не помещаются в репозиторий, пока вы не выполните команду commit, зафиксировав тем самым изменения. Выполнение команды add для файла, который был удален командой remove, отменит действие remove, если после нее еще не была выполнена команда commit. See section Удаление файлов, там находится пример.

Ключ командной строки `-k’ задает способ по умолчанию, которым будут извлекаться файлы, дальнейшая информация находится в section Подстановка ключевых слов.

Ключ командной строки `-m’ задает описание файла. Описание появляется в журнале истории, если разрешено его использование, see section Файл history. Также это описание будет сохранено в репозитории, когда файл будет зафиксирован. Команда log показывает это описание. Описание может быть изменено с помощью команды admin -t. See section Команда admin: администрирование. Если вы опустите флаг `-m описание, то у вас не спросят описания, а будет использована пустая строка.

Например, нижеследующие команды добавляют файл `backend.c’ в репозиторий:

$ cvs add backend.c
$ cvs commit -m “Early version. Not yet compilable.” backend.c

Когда вы добавляете файл, он добавляется только на ту ветку, над которой вы работаете (see section Создание ветвей и слияние). Вы можете позднее поместить добавления на другую ветку, если захотите (see section При слиянии можно добавлять и удалять файлы).

Удаление файлов

Содержимое каталогов меняется. Добавляются новые файлы, исчезают старые. Однако же, вам хотелось бы извлекать точные копии старых версий вашего проекта.

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

  • Убедитесь, что у вас неизмененная версия этого файла. See section Просмотр изменений, там описан один из способов убедиться в этом. Можно также использовать команды status или update. Если вы удалите файл без предварительной фиксации изменений, вы, конечно же, не сможете извлечь этот файл в том виде, в котором он находился перед удалением.
  • Удалите файл из рабочей копии каталога. Например, можно использовать программу rm.
  • Выполните `cvs remove имя-файла, чтобы сообщить CVS, что вы действительно хотите удалить этот файл.
  • Выполните `cvs commit имя-файла, чтобы зафиксировать удаление файла в репозитории.

Когда вы фиксируете удаление файла, CVS запоминает, что этого файла более не существует. Впрочем, он может существовать на одних ветках и не существовать на других, или же можно впоследствии добавить другой файл с тем же самым именем. CVS корректно создаст или не станет создавать файл, основываясь на ключах командной строки `-r’ или `-D’, заданных в командах checkout или update.

Команда: cvs remove [ключи] файлы …

Помещает файлы в список на удаление из репозитория (для того, чтобы эта команда сработала, нужно, чтобы файлы были удалены из рабочего каталога). Эта команда не удаляет файлы из репозитория, пока вы не зафиксируете удаление. Полный список ключей находится в section Краткий справочник по командам CVS.

Вот пример удаления нескольких файлов:

$ cd test
$ rm *.c
$ cvs remove
cvs remove: Removing .
cvs remove: scheduling a.c for removal
cvs remove: scheduling b.c for removal
cvs remove: use ‘cvs commit’ to remove these files permanently
$ cvs ci -m “Removed unneeded files”
cvs commit: Examining .
cvs commit: Committing .

Для удобства можно удалять файлы и одновременно делать cvs remove, используя ключ командной строки `-f’. Например, вышеприведенный пример можно переписать так:

$ cd test
$ cvs remove -f *.c
cvs remove: scheduling a.c for removal
cvs remove: scheduling b.c for removal
cvs remove: use ‘cvs commit’ to remove these files permanently
$ cvs ci -m “Removed unneeded files”
cvs commit: Examining .
cvs commit: Committing .

Если вы выполните команду remove, а затем перемените свое решение, еще не зафиксировав удаление, то команду remove можно отменить с помощью команды add.

$ ls
CVS   ja.h  oj.c
$ rm oj.c
$ cvs remove oj.c
cvs remove: scheduling oj.c for removal
cvs remove: use ‘cvs commit’ to remove this file permanently
$ cvs add oj.c
U oj.c
cvs add: oj.c, version 1.1.1.1, resurrected

Если вы осознаете свою ошибку перед выполнением команды remove, можно использовать update, чтобы воскресить файлы:

$ rm oj.c
$ cvs update oj.c
cvs update: warning: oj.c was lost
U oj.c

Когда вы удаляете файл, он удаляется только с той ветки, на которой вы работаете (see section Создание ветвей и слияние). Позже можно слить удаления на другую ветку, если захотите (see section При слиянии можно добавлять и удалять файлы).

Удаление каталогов

В принципе удаление каталогов в чем-то подобно удалению файлов — вы не хотите, чтобы каталог существовал в текущем рабочем каталоге, но вы хотите также, чтобы можно было извлекать старые версии проекта, в которых еще существовал каталог.

Можно удалить каталог, удалив все файлы в нем. Нет способа удалить сам каталог. Вместо этого вы задаете командам cvs update, cvs checkout или cvs export ключ командной строки `-P’, который заставит CVS удалять пустые каталоги в рабочем каталоге. Вероятно, лучше всего будет всегда указывать `-P’, если вы хотите, чтобы существовал пустой каталог, поместите в него пустой файл, например, `.keepme’, чтобы не дать CVS с ключом `-P’ удалить этот каталог.

Заметьте, что при использовании ключей `-r’ или `-D’ с командами checkout и export подразумевается также использование `-P’. При этом CVS сможет создать или не создавать каталог, в зависимости от того, находились ли в этом каталоге какие-либо файлы в конкретной версии проекта.

Перемещение и переименование файлов

Перемещение файлов в другой каталог или переименование их несложно, но некоторые аспекты могут быть неочевидными. Перемещение и переименование каталогов еще сложнее. See section Перемещение и переименование каталогов.)

В нижеприведенных примерах предполагается, что файл `old’ переименовывается в `new’.

Обычный способ переименования

Обычным способом перемещения файла является копирование old в new, а затем выполнение команд CVS для удаления файла old из репозитория и добавления туда файла new.

$ mv old new
$ cvs remove old
$ cvs add new
$ cvs commit -m ”old переименован в newold new

Это самый простой способ переместить файл, он не подвержен ошибкам, и сохраняет историю совершенных действий. Заметьте, что для доступа к истории файла нужно указать старое или новое имя, в зависимости от периода истории, к которому вы обращаетесь. Например, cvs log old выдаст журнал вплоть до момента переименования.

Когда new фиксируется, нумерация его ревизий начнется с нуля, обычно с 1.1, поэтому если это вам не нравится, используйте ключ командной строки `-r номер команды commit. Дальнейшую информацию смотри в section Назначение номеров ревизий.

Перемещение файла с ревизиями

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

$ cd $CVSROOT/dir
$ mv old,v new,v

Преимущества:

  • Журнал изменений сохраняется.
  • Номера ревизий не изменяются.

Недостатки:

  • Нет простого способа извлечь старые версии проекта из репозитория. Файл будет извлекаться под именем new даже для версий проекта, в которых он еще не был переименован.
  • Не сохраняется информация о том, когда был переименован файл.
  • Могут произойти неприятности, если кто-нибудь захочет поработать с файлом ревизий, пока вы его перемещаете. Убедитесь, что никто более не обращается к репозиторию, пока вы выполняете операцию.

Копирование файла с ревизиями

Этот способ также требует прямых изменений репозитория. Он безопасен, но не без подводных камней.

#  Копировать RCS-файл в репозитории 
$ cd $CVSROOT/dir
$ cp old,v new,v
#  Удалить старый файл 
$ cd ~/dir
$ rm old
$ cvs remove old
$ cvs commit old
# Удалить все метки из new
$ cvs update new
$ cvs log new   # Запомнить все метки, не являющиеся именами веток
$ cvs tag -d tag1 new
$ cvs tag -d tag2 new

Удалив метки, вы сможете извлекать старые ревизии

Преимущества:

  • Извлечение старых ревизий работает корректно, если вы используете для извлечения ревизий ключ командной строки `-rметка, а не `-Dдата.
  • Журнал изменений остается в целости и сохранности.
  • Номера ревизий не искажаются.

Недостатки:

  • Нет способа легко увидеть историю файла до переименования.

Перемещение и переименование каталогов

Обычный способ переименовать или переместить каталог — переименовать или переместить каждый файл в нем, как описано в section Обычный способ переименования. Затем следует извлечь их заново, используя ключ командной строки `-P’, как описано в section Удаление каталогов.

Если вам действительно нужно возиться с репозиторием, чтобы переименовать или удалить каталог в репозитории, вы можете сделать это так:

  1. Уведомить всех, у кого есть извлеченная копия каталога, что каталог будет переименован. Они должны зафиксировать свои изменения и удалить рабочие копии, перед тем, как вы предпримете дальнейшие шаги.
  2. Переименуйте каталог внутри репозитория.
    $ cd $CVSROOT/родительский-каталог
    $ mv старый-каталог новый-каталог
    
  3. Исправьте административные файлы CVS, если это требуется (например, если вы переименовали целый модуль).
  4. Сообщите всем, что они могут извлечь свои рабочие копии опять и продолжить работу.

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

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


Go to the first, previous, next, last section, table of contents.

Comments