Книга: Основы программирования в Linux
RCS
Разделы на этой странице:
RCS
Revision Control System (RCS, система управления версиями) содержит ряд команд для управления исходными файлами. Она функционирует, отслеживая исходный файл по мере его изменения и сохраняя единый файл со списком изменений, достаточно подробным для того, чтобы можно было воссоздать любую предыдущую версию файла. Система также позволяет хранить комментарии, связанные с каждым изменением, которые могут оказаться полезными, если вы оглядываетесь назад, изучая хронологию изменений файла.
По мере продвижения проекта вы можете регистрировать в файле отдельно каждое значительное изменение или исправление ошибки и сохранять комментарии к каждому изменению. Это может оказаться очень полезным при просмотре изменений, внесенных в файл, проверке фрагментов с исправленными ошибками, и иногда возможно и внесенными ошибками!
Поскольку RCS сохраняет только различия между версиями, она эффективно использует дисковое пространство. Кроме того, система позволяет получить предыдущие версии в случае ошибочного удаления.
Команда rcs
Для иллюстрации сказанного начните с начальной версии файла, которым хотите управлять. В данном случае давайте использовать файл important.c, который начинает существование как копия файла foo.с со следующим комментарием, добавленным в начало файла:
/*
Это важный файл для управления данным проектом.
В нем реализована каноническая программа "Hello World".
*/
Первая задача — инициализировать RCS-контроль над файлом с помощью команды rcs
. Команда rcs -i
инициализирует файл RCS-управления.
$ rcs -i important.с
RCS file: important.с,v
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>> This is an important demonstration file
>> .
done
$
Разрешается применять множественные строки комментариев. Завершите строку приглашения одиночной точкой (.
) в самой строке или набрав символ конца файла, обычно комбинацией клавиш <Ctrl>+<D>.
После этой команды rcs
создается новый предназначенный только для чтения (read-only) файл с расширением v.
$ ls -l
-rw-r--r-- 1 neil users 225 2007-07-09 07:52 important.c
-r--r--r-- 1 neil users 105 2007-07-09 07:52 important.с,v
$
Примечание
Если вы предпочитаете сохранять RCS-файлы в отдельном каталоге, просто создайте подкаталог с именем RCS перед первым применением команды rcs
. Все команды rcs
будут автоматически использовать подкаталог RCS для RCS-файлов.
Команда сi
Теперь вы можете выполнить регистрируемый ввод в RCS-файл (check-in) вашего файла с помощью команды ci
для сохранения его текущей версии.
$ ci important.с
important.c,v <-- important.c
initial revision: 1.1
done
$
Если вы забыли выполнить первой команду rcs -i
, RCS запросит описание файла. Если теперь заглянуть в каталог, то можно увидеть, что файл important.c удален.
$ ls -l
-r--r--r-- 1 neil users 443 2007-07-07 07:54 important.с,v
$
Содержимое файла и управляющая информация хранятся в RCS-файле important.c,v.
Команда со
Если вы хотите изменить файл, прежде всего его надо извлечь (check out). Если нужно просто прочитать файл, можно применить команду со для повторного создания текущей версии файла и изменения ее прав доступа на read-only (только чтение). Если же файл нужно редактировать, следует заблокировать файл с помощью команды со -l
. Причина заключается в том, что в командных проектах важно быть уверенным в том, что в определенный момент времени только один человек корректирует данный файл. Вот почему только у одной копии данной версии файла есть право на запись. Когда файл извлечен в каталог с правом на запись, RCS-файл блокируется. Заблокируйте копию файла
$ со -l important.c
important.с,v --> important.c
revision 1.1 (locked) done
$
и загляните в каталог:
$ ls -l
-rw-r--r-- 1 neil users 225 2007-07-09 07:55 important.c
-r--r--r-- 1 neil users 453 2007-07-09 07:55 important.с,v
$
Теперь у вас появился файл для редактирования и внесения новых изменений. Выполните корректировку, сохраните новую версию и используйте команду ci
еще раз для сохранения изменений. Секция вывода в файле important.c теперь следующая:
printf("Hello Worldn");
printf("This is an extra line added latern");
Примените ci
следующим образом:
$ ci important.с
important.с,v <-- important.c
new revision: 1.2;
previous revision: 1.1
enter log message, terminated with single or end of file:
>> Added an extra line to be printed out.
>> .
done
$
Примечание
Для записи изменений и сохранения блокировки, разрешающей пользователю продолжить работу с файлом, следует вызвать команду ci
с опцией -l
. Файл будет автоматически снова извлечен в каталог для того же самого пользователя.
Вы сохранили обновленную версию файла. Если сейчас заглянуть в каталог, можно увидеть, что файл important.c снова удален.
$ ls -l
-r--r--r-- 1 neil users 635 2007-07-09 07:55 important.с,v
$
Команда rlog
Часто бывает полезно просмотреть сводку изменений, внесенных в файл. Сделать это можно с помощью команды rlog
.
$ rlog important.с
RCS file: important.c,v
Working file: important.c
head: 1.2
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 2; selected revisions: 2
description:
This is an important demonstration file
------------------------
revision 1.2
date: 2007/07/09 06:57:33; author: neil; state: Exp; lines: +1 -0
Added an extra line to be printed out.
------------------------
revision 1.1
date: 2007/07/09 06:54:36; author: neil; state: Exp;
Initial revision
==================================================================
$
В первой части дается описание файла и опций, используемых командой rcs
. Далее команда rlog
перечисляет версии файла, начиная с самой свежей, вместе с текстом, который вы вводите при сохранении версии. lines:+1-0
в версии 1.2 информирует вас о том, что была вставлена одна строка и ни одна строка не была удалена.
Примечание
Учтите, что время модификации файла записывается без учета летнего времени, чтобы избежать проблем при переводе часов.
Теперь, если вы хотите вернуть первую версию файла, можно запросить команду со
, указав нужную версию.
$ со -r1.1 important.c
important.с,v --> important.c
revision 1.1
done
$
У команды ci
тоже есть опция -r
, которая присваивает номеру версии заданное значение. Например, команда
ci -r2 important.c
сохранит файл important.c как версию 2.1. Обе системы, RCS и SCCS, по умолчанию используют 1 как наименьший номер версии.
Команда rcsdiff
Если вы хотите знать, чем отличаются две версии, можно применить команду rcsdiff
:
$ rcsdiff -r1.1 -r1.2 important.c
=================================================
RCS file: important.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -r1.1 -r1.2
11a12
> printf("This is an extra line added latern");
$
Вывод информирует вас о том, что была добавлена одна строка после исходной строки 11.
Обозначение версий
Система RCS может применять специальные строки (макросы) внутри исходного файла, помогающие отслеживать изменения. Наиболее популярны два макроса: $RCSfile$
и $Id$
. Макрос $RCSfile$
замещается именем файла, а макрос $Id$
— строкой, обозначающей версию. Полный список поддерживаемых специальных строк можно найти в интерактивном руководстве. Макросы замещаются, когда версия файла извлекается из RCS-файла, и обновляются автоматически, когда версия регистрируется и сохраняется в RCS-файле.
Давайте в третий раз изменим файл и добавим несколько таких макросов:
$ со -l important.с
important.c,v --> important.с
revision 1.2 (locked)
done
$
Отредактируйте файл в соответствии с приведенным далее кодом:
#include <stdlib.h>
#include <stdio.h>
/*
Это важный файл для управления данным проектом.
В нем реализована каноническая программа "Hello World".
Filename: $RCSfile$
*/
static char *RCSinfo = "$Id$";
int main() {
printf ("Hello Worldn");
printf("This is an extra line added latern");
printf("This file is under RCS control. Its ID isn%sn", RCSinfo);
exit(EXIT_SUCCESS);
}
Теперь сохраните эту версию и посмотрите, как RCS управляет специальными строками:
$ ci important.с
important.с,v <-- important.c
new revision: 1.3;
previous revision: 1.2
enter log message, terminated with single '.' or end of file:
>> Added $RCSfile$ and $Id$ strings
>> .
done
$
Если заглянете в каталог, то найдете только RCS-файл.
$ ls -l
-r--r--r-- 1 neil users 907 2007-07-09 08:07 important.с,v
$
Если вы извлечете текущую версию исходного файла (с помощью команды со
) и просмотрите его, то увидите, что макросы раскрыты:
#include <stdlib.h>
#include <stdio.h>
/*
Это важный файл для управления данным проектом.
В нем реализована каноническая программа "Hello World".
Filename: $RCSfile: important.с,v $
*/
static char *RCSinfo = "$Id: important.c,v 1.3 2007/07/09. 07:07:08 neil Exp $";
int main() {
printf("Hello Worldn");
printf("This is an extra line added latern");
printf("This file is under RCS control. Its ID isn%sn", RCSinfo);
exit(EXIT_SUCCESS);
}
А теперь выполните упражнение 9.6.
Упражнение 9.6. GNU-версия make
с RCS
У команды make
версии GNU есть несколько встроенных правил для управления RCS-файлами. В этом примере вы увидите, как работать с отсутствующим исходным файлом.
$ rm -f important.с
$ make important
со important.с,v important.c
important.с,v --> important.c
revision 1.3
done
сс -c important.c -o important.о сс important.о -о important
rm important.о important.с
$
Как это работает
У команды make
есть стандартное правило для создания файла без расширения с помощью компиляции файла с тем же именем и расширением с. Второе стандартное правило разрешает make
создать файл important.c из файла important.c,v, используя RCS. Поскольку нет файла с именем important.c, команда make
создала файл с расширением с, получив последнюю версию файла с помощью команды со
. После компиляции она навела порядок, удалив файл important.c.
Команда ident
Команду ident
можно применять для поиска версии файла, которая содержит строку $Id$
. Поскольку вы сохранили строку в переменной, она появляется и в результирующем исполняемом файле. Может оказаться так, что, если вы включили специальные строки в исходный код, но никогда не обращаетесь к ним, компилятор из соображений оптимизации удалит их. Эту проблему можно обойти, добавив в исходный код несколько фиктивных обращений к ним, хотя по мере улучшения компиляторов делать это становится все труднее!
Далее показан простой пример того, как можно использовать команду ident
для двойной проверки RCS-версии исходного файла, применяемого для формирования исполняемого файла (упражнение 9.7).
Упражнение 9.7. Команда ident
$ ./important
Hello World
This is an extra line added later
This file is under RCS control. Its ID is
$Id: important.c,v 1.3 2007/07/09 07:07:08 neil Exp $
$ ident important
important:
$Id: important.c,v 1.3 2007/07/09 07 :07 :08 neil Exp $
$
Как это работает
Выполняя программу, вы показываете строку, включенную в исполняемый файл. Далее вы демонстрируете, как команда ident
может извлечь из исполняемого файла строки вида $Id$
.
Этот метод применения RCS и строк вида $Id$
, включаемых в исполняемые файлы, может быть очень мощным средством определения версии файла, содержащей ошибку, о которой сообщил пользователь. RCS-файлы (или SCCS) можно применять как часть средства отслеживания в проекте проблем, о которых сообщается, и способов их устранения. Если вы продаете программное обеспечение или даже отдаете его бесплатно, очень важно знать, что изменилось между двумя выпущенными версиями.
Если вас интересует дополнительная информация, на странице rcsintro
интерактивного руководства в дополнение к стандартному руководству по RCS приведено введение в систему RCS. В него также включены страницы, посвященные отдельным командам, таким как ci
, со
и т.д.
- Сравнение RCS и SCCS
- 11.3.2. Example rcS Initialization Script
- 15.5.4.2. Revision Control System (RCS)
- 19.2.1.4. Не отправляйте заплат, которые только убирают $-идентификаторы систем RCS или SCCS
- 10.2.5. Работа с данными в формате CSV
- Пример A-20. Функции для работы со строками
- Loading the Linux Kernel
- Chapter 13. Development Tools
- 6.3.2. Example Web Server Startup Script
- 13.3. cbrowser
- 16.3.2 Deadlock Detection
- 13.6.2 Согласование типа терминала VT100