CVS -- Система Управления Параллельными Версиями - Подстановка ключевых слов

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


Подстановка ключевых слов

Пока вы редактируете исходные файлы в рабочем каталоге, вы всегда можете узнать их статус с помощью `cvs status' и `cvs log'. Как только вы экспортируете файлы из вашей среды разработки, становится гораздо сложнее узнать, какую ревизию эти файлы имеют.

CVS может использовать механизм, известный как подстановка ключевых слов (или замена ключевых слов), чтобы помочь в идентификации файлов. Строки вида $keyword$ и $keyword:...$ в файле заменяются строками вида $keyword:value$ каждый раз, когда вы получаете новую ревизию файла.

Список ключевых слов

Вот список ключевых слов:

$Author: ott $
Имя пользователя, который поместил ревизию в репозиторий.
$Date: 2000/07/11 03:41:42 $
Дата и время (в UTC), когда была зафиксирована ревизия.
$Header: /home/linuxcvs/cvsroot/books/GNU/cvs/cvs-ru_12.html,v 1.1.1.1 2000/07/11 03:41:42 ott Exp $
Стандартный заголовок, содержащий полное имя RCS-файла, номер ревизии, дату в UTC, имя автора, состояние и имя блокировавшего этот файл (если файл заблокирован). Файлы обычно не блокируются при использовании CVS.
$Id: cvs-ru_12.html,v 1.1.1.1 2000/07/11 03:41:42 ott Exp $
Точно так же, как $Header: /home/linuxcvs/cvsroot/books/GNU/cvs/cvs-ru_12.html,v 1.1.1.1 2000/07/11 03:41:42 ott Exp $, только имя RCS-файла указано без полного пути.
$Name: $
Имя метки, использованной при извлечении этого файла. Это ключевое слово заменяется только если при извлечении было явно задано имя метки. Например, при выполнении команды cvs co -r first это ключевое слово заменяется на `Name: first'.
$Locker: $
Имя пользователя, который заблокировал эту ревизию (пустое, если файл не заблокирован, как обычно и бывает, если не использовалась команда cvs admin -l).
$Log: cvs-ru_12.html,v $
Revision 1.1.1.1 2000/07/11 03:41:42 ott
Сделан отдельный каталог для переводов проекта GNU, импортируется
документация по CVS, Automake, gdb, Texinfo.
Сюда же будут перемещены уже имеющиеся переводы.
Будет добавлен перевод руководства по GNU Emacs
Журнальное сообщение, которое было введено во время фиксации изменений, перед которым идет имя RCS-файла, номер ревизии, имя автора и дата в UTC. Существующие журнальные сообшения не заменяются. Вместо этого, новое журнальное сообщение добавляется после $Log: cvs-ru_12.html,v $ добавляется после Revision 1.1.1.1 2000/07/11 03:41:42 ott добавляется после Сделан отдельный каталог для переводов проекта GNU, импортируется добавляется после документация по CVS, Automake, gdb, Texinfo. добавляется после Сюда же будут перемещены уже имеющиеся переводы. добавляется после Будет добавлен перевод руководства по GNU Emacs добавляется после . Каждая новая строка содержит в начале ту же самую строку, которая находится перед ключевым словом $Log: cvs-ru_12.html,v $ перед ключевым словом Revision 1.1.1.1 2000/07/11 03:41:42 ott перед ключевым словом Сделан отдельный каталог для переводов проекта GNU, импортируется перед ключевым словом документация по CVS, Automake, gdb, Texinfo. перед ключевым словом Сюда же будут перемещены уже имеющиеся переводы. перед ключевым словом Будет добавлен перевод руководства по GNU Emacs перед ключевым словом . Например, если в файле находится
  /* Here is what people have been up to:
   *
   * $Log: cvs-ru_12.html,v $
   * Revision 1.1.1.1  2000/07/11 03:41:42  ott
   * Сделан отдельный каталог для переводов проекта GNU, импортируется
   * документация по CVS, Automake, gdb, Texinfo.
   * Сюда же будут перемещены уже имеющиеся переводы.
   * Будет добавлен перевод руководства по GNU Emacs
   *
   * Revision 1.1  1997/01/03 14:23:51  joe
   * Add the superfrobnicate option
   *
   */
то перед дополнительными строками, которые добавляются при замене ключевого слова $Log: cvs-ru_12.html,v $ ключевого слова Revision 1.1.1.1 2000/07/11 03:41:42 ott ключевого слова Сделан отдельный каталог для переводов проекта GNU, импортируется ключевого слова документация по CVS, Automake, gdb, Texinfo. ключевого слова Сюда же будут перемещены уже имеющиеся переводы. ключевого слова Будет добавлен перевод руководства по GNU Emacs ключевого слова , будет находиться ` * '. В отличие от предыдущих версий CVS и RCS, префикс комментария из RCS-файла не используется. Ключевое слово $Log полезно при накоплении полного журнала изменений в исходном файле, но по нескольким причинам это может привести к определенным проблемам. See section Проблемы с ключевым словом $Log: cvs-ru_12.html,v $ See section Проблемы с ключевым словом Revision 1.1.1.1 2000/07/11 03:41:42 ott See section Проблемы с ключевым словом Сделан отдельный каталог для переводов проекта GNU, импортируется See section Проблемы с ключевым словом документация по CVS, Automake, gdb, Texinfo. See section Проблемы с ключевым словом Сюда же будут перемещены уже имеющиеся переводы. See section Проблемы с ключевым словом Будет добавлен перевод руководства по GNU Emacs See section Проблемы с ключевым словом..
$RCSfile: cvs-ru_12.html,v $
Имя RCS-файла без полного пути.
$Revision: 1.1.1.1 $
Номер ревизии.
$Source: /home/linuxcvs/cvsroot/books/GNU/cvs/cvs-ru_12.html,v $
Полное имя RCS-файла.
$State: Exp $
Состояние, присвоенное ревизии. Состояния могут назначаться с помощью cvs admin -s -- см. section Ключи команды admin.

Использование ключевых слов

Для того, чтобы поместить в файл ключевое слово, вы просто пишете в нём, например, $Id: cvs-ru_12.html,v 1.1.1.1 2000/07/11 03:41:42 ott Exp $, а затем фиксируете файл. CVS автоматически заменит ключевое слово во время операции фиксирования.

Обычной практикой является помещение строки $Id$ в исходные файлы, чтобы они оказались в файлах, созданных из исходных. Например, если вы управляете исходным кодом компьютерной программы, вы можете создать переменную, которая инициализируется этой строкой. Некоторые компиляторы языка C поддерживают директиву #pragma ident. Система управления документами может обеспечивать способ для передачи строки в сгенерированные файлы.

Команда ident, являющаяся частью пакета RCS, может использоваться для извлечения из файла ключевых слов и их значений. Это полезно для работы с текстовыми файлами, и особенно полезно для извлечения ключевых слов из двоичных файлов.

$ ident samp.c
samp.c:
     $Id: cvs-ru_12.html,v 1.1.1.1 2000/07/11 03:41:42 ott Exp $
$ gcc samp.c
$ ident a.out
a.out:
     $Id: cvs-ru_12.html,v 1.1.1.1 2000/07/11 03:41:42 ott Exp $

SCCS -- другая популярная система контроля ревизий. В её состав входит команда what, очень похожая на ident и использующаяся в тех же целях. Во многих местах, где не установлен RCS, стои SCCS. Так как what ищет последовательность символов @(#), то можно довольно просто вставлять ключевые слова, которые обнаруживаются обеими командами. Просто поместите перед ключевым словом RCS волшебную фразу SCCS, например:

static char *id="@(#) $Id: cvs-ru_12.html,v 1.1.1.1 2000/07/11 03:41:42 ott Exp $";

Как избежать подстановки

Подстановка ключевых слов имеет свои недостатки. Иногда бывает нужно, чтобы строка `$'Author$ появилась в файле без того, чтобы CVS интерпретировала её как ключевое слово и заменила на что-нибудь типа `$'Author: ceder $.

К сожалению, нельзя выборочно отключить подстановку ключевых слов. Можно использовать ключ командной строки `-ko' (see section Режимы подстановки), чтобы полностью выключить подстановку.

Во многих случаях вам нужно избежать использования ключевых слов в исходном тексте, даже несмотря на то, что они появятся в конечном продукте. Например, исходный текст этого руководства содержит `$@asis{}Author$' везде, где должна появиться строка `$'Author$. При использовании nroff и troff можно поместить в ключевое слово нулевой символ \&, чтобы добиться подобного эффекта.

Режимы подстановки

Вместе с каждым файлом хранится режим подстановки по умолчанию, и каждая копия файла в рабочем каталоге также имеет режим подстановки. Режим по умолчанию задается с помощью ключа `-k' команд cvs add и cvs admin; режим в рабочем каталоге задается с помощью ключей `-k' и `-A' команд cvs checkout и cvs update. Команда cvs diff также имеет ключ `-k'. Некоторые примеры приведены в section Обработка двоичных файлов.

Доступные режимы таковы:

`-kkv'
Генерировать строки из ключевых слов стандартным образом, то есть из ключевого слова Revision получается $Revision: 5.7 $.
`-kkvl'
Подобно `-kkv', только всегда указывается имя блокировщика, если данная ревизия в настоящий момент заблокирована. Имя блокировщика имеет смысл только если используется cvs admin -l.
`-kk'
Генерировать только имена ключевых слов и опускать их значения. Например, для ключевого слова Revision получается строка $Revision$, а не $Revision: 5.7 $. Этот ключ полезен для игнорирования изменения, возникших в результате подстановки ключевых слов, при сравнении разных ревизий файла.
`-ko'
Генерирует старую строку, присутствовавшую в рабочем файле перед тем, как он был зафиксирован. Например, для ключевого слова Revision генерируется строка $Revision: 1.1 $ вместо $Revision: 5.7 $, если она была записана именно так, когда файл был помещен в репозиторий.
`-kb'
Подобно `-ko', но также предотвращает преобразование символов конца строк между канонической формой, в которой они хранятся в репозитории (только символ перевода строки), и формой, принятой в используемой операционной системе. Для систем, подобных UNIX, в которых для завершения строк используется символ перевод строки, этот режим совпадает с `-ko'. Дальнейшая информация о двоичных файлах находится в section Обработка двоичных файлов.
`-kv'
Генерирует только значения ключевых строк. Например, для ключевого слова Revision генерируется строка 5.7 вместо $Revision: 5.7 $. Это может помочь при генерации файлов в языках программирования, в которых сложно отщепить разделители, такие как $Revision: $, от конца строки. Однако, дальнейшая подстановка ключевых слов не может быть осуществлена, когда удалены ключевые слова, поэтому этот ключ нужно использовать осторожно. Часто бывает полезно использовать `-kv' совместно с командой cvs export -- see section Команда export: экспортировать исходные тексты. Помните только, что этот ключ некорректно экспортирует двоичные файлы.

Проблемы с ключевым словом $Log: cvs-ru_12.html,v $

Проблемы с ключевым словом Revision 1.1.1.1 2000/07/11 03:41:42 ott

Проблемы с ключевым словом Сделан отдельный каталог для переводов проекта GNU, импортируется

Проблемы с ключевым словом документация по CVS, Automake, gdb, Texinfo.

Проблемы с ключевым словом Сюда же будут перемещены уже имеющиеся переводы.

Проблемы с ключевым словом Будет добавлен перевод руководства по GNU Emacs

Проблемы с ключевым словом.

Ключевое слово $Log$ довольно-таки спорно. Пока вы работаете над проектом, информация легко доступна даже без использования ключевого слова $Log$: просто вызовите cvs log. Когда вы экспортируете файл, информация об его истории в любом случае практически бесполезна.

Более серьёзным обстоятельством является то, что CVS не слишком хорошо справляется с пунктами $Log$, когда ветка объединяется с основным стволом. В результате такого объединения часто возникают конфликты.

Люди часто стараются "исправить" журнальные записи в файле, исправляя орфографические и даже фактические ошибки. В результате информация от cvs log не совпадает с информацией в файле. Это может быть, а может и не быть проблемой в реальной жизни.

Звучали рекомендации помещать ключевое слово $Log$ в конец файла (если вообще использовать это слово). В этом случае длинный список сообщений об изменениях не будет мешать чтению исходного файла.


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