В процессе разработки проекта часто требуется добавлять, удалять или переименовывать файлы и каталоги. Исходя из общих принципов, требуется, чтобы CVS запоминала факт совершения такого действия, вместо того, чтобы совершать необратимое изменение, точно так же, как она обращается с изменениями файлов. Точные механизмы, действующие в этих случаях, зависят от конкретной ситуации.
Для того, чтобы добавить новый файл в каталог, совершите следующие шаги:
Можно также использовать команду add
для добавления нового
каталога.
В отличие от большинства других команд, команда add
не
является рекурсивной. Вы даже не можете сказать `cvs add
foo/bar'. Вместо этого, вам потребуется выполнить
$ cd foo
$ cvs add bar
-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 При слиянии можно добавлять и удалять файлы).
Содержимое каталогов меняется. Добавляются новые файлы, исчезают старые. Однако же, вам хотелось бы извлекать точные копии старых версий вашего проекта.
Вот как можно удалить файл, сохранив доступ к его старым ревизиям:
status
или
update
. Если вы удалите файл без предварительной фиксации
изменений, вы, конечно же, не сможете извлечь этот файл в том
виде, в котором он находился перед удалением.
rm
.
Когда вы фиксируете удаление файла, CVS запоминает, что
этого файла более не существует. Впрочем, он может существовать
на одних ветках и не существовать на других, или же можно
впоследствии добавить другой файл с тем же самым именем.
CVS корректно создаст или не станет создавать файл,
основываясь на ключах командной строки `-r' или `-D',
заданных в командах checkout
или update
.
Помещает файлы в список на удаление из репозитория (для того, чтобы эта команда сработала, нужно, чтобы файлы были удалены из рабочего каталога). Эта команда не удаляет файлы из репозитория, пока вы не зафиксируете удаление. Полный список ключей находится в 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 переименован в new" old new
Это самый простой способ переместить файл, он не подвержен
ошибкам, и сохраняет историю совершенных действий. Заметьте, что
для доступа к истории файла нужно указать старое или новое имя, в
зависимости от периода истории, к которому вы обращаетесь.
Например, cvs log old
выдаст журнал вплоть до
момента переименования.
Когда new фиксируется, нумерация его ревизий начнется с
нуля, обычно с 1.1, поэтому если это вам не нравится, используйте
ключ командной строки `-r номер' команды
commit
. Дальнейшую информацию смотри в section Назначение номеров ревизий.
Этот метод более опасен, потому что требует перемещения файлов в
репозитории. Прочтите всю главу перед попытками применить этот
метод!
$ cd $CVSROOT/dir
$ mv old,v new,v
Преимущества:
Недостатки:
Этот способ также требует прямых изменений репозитория. Он
безопасен, но не без подводных камней.
# Копировать 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
...
Удалив метки, вы сможете извлекать старые ревизии
Преимущества:
Недостатки:
Обычный способ переименовать или переместить каталог --- переименовать или переместить каждый файл в нем, как описано в section Обычный способ переименования. Затем следует извлечь их заново, используя ключ командной строки `-P', как описано в section Удаление каталогов.
Если вам действительно нужно возиться с репозиторием, чтобы переименовать или удалить каталог в репозитории, вы можете сделать это так:
$ cd $CVSROOT/родительский-каталог
$ mv старый-каталог новый-каталог
Если кто-то не удалил свою рабочую копию, команды CVS будут отказываться работать, пока он не удалит каталог, которого больше не существует в репозитории.
Почти всегда гораздо лучшим способом будет переместить файлы в каталоге, вместо того, чтобы перемещать каталог, потому что иначе вы, скорее всего, не сможете корректно извлекать старые версии вашего проекта, так как они, вероятно, зависят от имен каталогов.
Go to the first, previous, next, last section, table of contents.