Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
QNX 4 Руководство пользователя.doc
Скачиваний:
248
Добавлен:
02.05.2014
Размер:
1.02 Mб
Скачать

Глава 12. Использование системы управления версиями

В этой главе...

Что такое система управления версиями - RCS (Revision Control

System)?

Подготовка к работе

Автоматическая идентификация

Фор-мат RCS-файлов

Команды RCS

12.1. Что такое RCS?

RCS помогает Вам управлять множеством версий текстовых файлов.

RCS автоматизирует хранение, поиск, регистрацию, определение и объ-

единение версий. RCS полезна для любого текста, который часто меня-

ется, включая программы, документацию, графику, статьи и форматы

писем.

Точнее говоря, RCS позволяет Вам делать следующее:

- Хранить и отыскивать множество версий текста - В RCS измене-

ния не уничтожают подлинник; предшествующие версии остаются доступ-

ными. Вы можете отыскать версии в диапазоне по числу исправлений,

символическим именам, дате, авторам и состоянию.

- Поддерживать полную историю изменений - RCS регистрирует все

изменения автоматически. Кроме того, в тексте каждой версии RCS

хранит имя автора, дату, время регистрации и регистрационное сооб-

щение, суммирующее изменения. Регистрация облегчает выяснение, что

случилось с модулем, не делая сравнения исходных распечаток и не

беспокоя расспросами коллег.

- Решать конфликты доступа - Когда два или более программиста

пытаются изменить одну и ту же версию, RCS предупреждает програм-

мистов и предохраняет одну модификацию от искажения другой.

- Поддерживать дерево версий - RCS может поддерживать отдель-

ные строки разработки для каждого модуля. Система загружает древо-

видную структуру, которая представляет собой предшествующие связи

между версиями.

- Объединение версий и разрешение конфликтов - Вы можете объ-

единить две отдельные строки разработки для модуля. Если версии,

которые нужно объединить, относятся к одному и тому же коду, RCS

предупреждает Вас о перекрытии версий.

- Управление версиями и конфигурациями - Вы можете присвоить

символические имена версиям и отметить версии, как выходные, ста-

бильные, экспериментальные и т.п. Таким способом конфигурация моду-

лей может быть описана просто и непосредственно.

- 141 -

- Автоматически опознавать каждую версию - RCS позволяет Вам

присвоить каждой версии имя, номер версии, время создания, автора и

т.п. Идентификация - подобно метке, которую Вы можете вставить в

соответствующее место текста версии. Идентификация упрощает опреде-

ление того, какие версии каких модулей создают данную конфигурацию.

- Минимизировать вторичную память - RCS необходим небольшой

дополнительный объем памяти для версий, т.к. хранятся только разли-

чия. Если промежуточные версии удаляются, то соответствующие данные

сжимаются.

12.2. Подготовка к работе

Базовый интерфейс с пользователем для RCS прост для изучения.

Вы можете выполнить большинство основных функций с помощью только

двух команд:

- команда ci - "check-in". Эта команда размещает содержимое

файла в архивном файле, названном RCS-файлом. RCS-файл содержит все

версии конкретного файла;

- команда co - "check-out". Эта команда отыскивает исправления

в RCS-файле, создавая рабочий файл.

12.2.1. Сохранение

Теперь допустим, у Вас есть файл f.c, который Вы хотите уста-

новить под управлением RCS. Вызовите команду сохранения ci:

ci f.c

Эта команда:

1) создает RCS-файл f.c,v;

2) загружает f.c в f.c,v, как исправление 1.1;

3) удаляет f.c;

4) запрашивает у Вас описание.

Описание, которое Вы вводите, должно быть кратким обзором со-

держимого файла. Все последующие команды сохранений запросят у Вас

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

Вы сделали. Файлы, заканчивающиеся ",v", называются RCS-файлами

(v стоит для "версий"); все другие файлы называются рабочими файла-

ми.

12.2.2. Извлечение

Для того, чтобы получить рабочий файл f.c в вышеуказанном при-

мере, используйте команду извлечения co:

- 142 -

со f.c

Эта команда извлекает самую последнюю версию из f.c,v и запи-

сывает его в f.c. Если Вы хотите отредактировать f.c, Вы должны

заблокировать доступ к нему, когда Вы извлекаете его по команде со:

со -l f.c

Теперь Вы можете редактировать f.c.

Скажем, Вы провели редактирование и хотите увидеть, какие из-

менения Вы сделали. Команда:

rcsdiff f.c

сообщит Вам различие между самой последней сохраненной версией и ра-

бочим файлом. Вы можете затем опять сохранить файл, вызывая:

ci f.c

При этом номер версии соответственно увеличивается.

12.2.3. Блокирование файлов

Если ci выдает сообщение:

ci error: no lock set by your name

Это значит, что Вы пытались выполнить сохранение (ci) файла,

не блокируя его при выполнении извлечения (co). Конечно, теперь уже

поздно выполнять команду co с блокировкой, т.к. другая команда co

перезапишет Ваши модификации. Вместо этого, Вам следует вызвать:

rcs -l f.c

Эта команда заблокирует для Вас самую последнюю версию, если

кто-нибудь другой уже не опередил Вас. В этом случае Вы должны до-

говориться с этим человеком.

Блокировка гарантирует, что Вы и только Вы можете сохранить

следующую коррекцию, и избавляет от проблем, если несколько человек

работают с одним и тем же файлом. Даже если версия блокирована, то

файл может быть доступен для чтения, компиляции и т.п.

Единственное, что обеспечивает блокировка, это предотвращение

выполнения команды ci кем-нибудь другим, кто не выполнил блокирова-

ние. Если Ваш RCS-файл - личный (то есть Вы - единственный человек,

- 143 -

который собирается делать в нем исправления), строгая блокировка не

нужна и Вы можете ее отключить.

Если строгая блокировка выключена, владелец RCS-файла не нуж-

дается в блокировании для команды ci, но все другие пользователи

должны ее делать.

Включить и выключить строгую блокировку Вы можете следующими

командами:

rcs -L f.c установить строгую блокировку

rcs -u f.c установить нестрогую блокировку

12.2.4. Создание RCS-каталога

Если Вы не хотите привести в беспорядок Ваш текущий каталог с

RCS-файлами, создайте подкаталог, названный RCS, в Вашем текущем

каталоге и переместите туда все Ваши RCS-файлы. RCS-команды прос-

мотрят сначала этот каталог, чтобы найти необходимые файлы. Все ко-

манды, рассмотренные выше, будут работать без какой-либо модифика-

ции.

Вы можете определить пары RCS- и рабочих файлов тремя путями:

- задать оба файла;

- задать только рабочий файл;

- задать только RCS-файл.

Как RCS, так и рабочие файлы могут иметь произвольные префиксы

маршрута; команды RCS сопоставят их автоматически.

12.2.5. Защита Вашего рабочего файла

Для того, чтобы избежать удаления рабочего файла во время вы-

полнения check-in в случае, если Вы хотите продолжить редактирова-

ние или компиляцию, введите одну из этих команд:

ci -l f.c

ci -u f.c

Эти команды сохраняют f.c, как обычно, но выполняют неявное

извлечение. Таким образом, они сохраняют Вам одну операцию

check-out. Команда ci -l также блокирует сохранение версии - это

полезно, если Вы хотите продолжить редактировать. Команда ci -u не

блокирует сохранение версии - это полезно, если Вы просто хотите

прочитать файл. Обе команды корректируют маркеры идентификации в

Вашем рабочем файле (смотрите "Автоматическую идентификацию").

12.2.6. Присваивание номеров исправлений

- 144 -

В команде ci Вы можете задать номер, который Вы хотите присво-

ить сохраняемым версиям. Скажем, все Ваши версии были пронумерованы

1.1, 1.2, 1.3 и т.п., и Вы хотите начать версию 2. Одна из этих ко-

манд:

ci -r2 f.c

ci -r2.1 f.c

присвоит номер 2.1 новому исправлению. Затем команда ci будет нуме-

ровать последующие исправления: 2.2, 2.3 и т.п. Соответствующие ко-

манды со:

со -r2 f.c

со -r2.1 f.c

найдут самое последнее исправление с номером 2.x и исправление 2.1,

соответственно. Если Вы вызываете команду со без номера версии, она

выбирает самую последнюю версию (то есть самую последнюю версию с

номером, состоящим из двух частей). Номера более чем с двумя частя-

ми необходимы для ветвей. Например, для того, чтобы начать ветвь в

версии 1.3, вызовите:

ci -r1.3.1 f.c

Эта команда начинает ветвь номер в версии 1.3 и присваивает

номер 1.3.1.1 новой версии. Для получения дополнительной информации

о ветвях смотрите раздел "Формат RCS-файлов".

12.3. Автоматическая идентификация

RCS позволяет Вам размещать специальные строки идентификации в

Ваши исходный и объектный коды. Вы просто устанавливаете маркер:

$Id$

в Ваш текст, например, в комментарии. RCS заменит этот маркер строкой

следующего вида:

$Id: filename revision date time author state $

С таким маркером на первой странице каждого модуля Вы можете

всегда увидеть, с какой версией Вы работаете. RCS сохраняет маркеры

последней версии автоматически. Для того, чтобы перенести маркеры в

Ваш объектный код, просто поместите их в литерные символьные стро-

- 145 -

ки. В языке Cи Вы делаете это следующим образом:

static char rcsid[] = "$Id$";

Команда ident извлекает такие маркеры из любого файла, даже

объектного кода и дампов. Таким образом, команда ident позволяет

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

ной программе. Полезно устанавливать маркер $Log$ в Ваш текст в

комментарии. Этот маркер накапливает регистрационные сообщения, ко-

торые запрашиваются во время регистрации. Таким образом, Вы можете

хранить полную историю Вашего файла непосредственно в файле. Есть

различные дополнительные маркеры идентификации; описание команды со

дано в "Utilities Reference".

12.3.1. Дополнительная информация

Если Вы хотите получить дополнительную информацию о RCS, мы

рекомендуем: Walter F. Tichy, "RCS - система для управления версия-

ми," Software - Practice & Experience 15, 7, July 1985.

12.4. Формат RCS-файлов

Содержание RCS-файлов описано нижеуказанной грамматикой. Текст

- в свободном формате, следующие символы, которые формируют пробел,

не имеют никакого значения и исключаются в строках:

<space>

<backspace>

<tab>

<newline>

<vertical tab>

<form feed>

<carrige return>

Строки заканчиваются одним знаком @ в конце каждой строки. Ес-

ли строка должна содержать эти знаки, знак @ должен быть удвоен. В

противном случае, строки могут содержать произвольные двоичные дан-

ные. Метасинтаксис использует следующие соглашения:

.

- 146 -

-------------------------------------------------------------------

Соглашение: Назначение:

-------------------------------------------------------------------

| разделяет альтернативы

{ и } включает необязательные фразы

{ и }* включает фразы, которые могут быть повторены нуль

или более раз

{ и }+ включает фразы, которые должны появиться, по крайней

мере, один раз и могут быть повторены

-------------------------------------------------------------------

Имейте в виду также, что эти терминальные символы выделены

двойной толщиной; нетерминальные символы - курсивом.

rcstext ::= admin {delta}* desc {deltatext}*

admin ::= head {num};

{ branch {num}; }

access {id}*;

symbols {id:num}*;

locks {id:num}*; {strict;}

{ comment {string}; }

{ expend {string}; }

{ newphrase }*

delta ::= num

date num;

author id;

state {id};

branches {num}*;

next {num};

{ newphrase }

desc ::= desc string

deltatext ::= num

log string

{ newphrase }*

text string

num ::= {digit{.}}+

digit ::= 0|1|..|9

id ::= letter{idchar}*

- 147 -

letter ::= любая буква

idchar ::= любой видимый графический символ кроме специального

special ::= $|,|.|:|;|@

string ::= @{любой символ с удвоенным @}*@

newphrase ::= id word*;

word ::= id|num|string|:

Идентификаторы зависят от регистра. Ключевые слова - только на

нижнем регистре. Множества ключевых слов и идентификаторов могут

перекрываться.

В большинстве сред RCS использует кодирование по ISO_8859/1:

буквы - восьмиричные коды 101-132, 141-172, 300-326, 330-366 и

370-377;

видимые графические символы - коды 041-176 и 240-377;

символы пробелов - коды 010-015 и 040. Идентификаторы newphra-

se в грамматике резервируются для будущих расширений в формате

RCS-файлов.

Никакой из идентификаторов newphrase не начнется с любого, уже

применяемого, ключевого слова. Узлы delta образуют дерево. Все уз-

лы, чьи номера состоят из единственной пары (например, 2.3, 2.1,

1.3 и т.п.), образуют ствол и компонуются через следующее поле в

порядке уменьшения чисел.

Поле head в узле admin указывает на начало этой последователь-

ности (то есть оно содержит самую верхнюю пару).

Узел branch в узле admin указывает по умолчанию на ветвь (или

версию) для большинства RCS-операций. Если там пусто, то по умолча-

нию ветвью будет самая верхняя ветвь в цепочке.

Все узлы delta, у которых номера состоят из 2n полей (n) (нап-

ример, 3.1.1.1, 2.1.2.2 и т.п.) компонуются следующим образом. Все

узлы, у которых первые 2n-1 поля номера - идентичны, компонуются

через поле next в порядке увеличения номеров. Для каждой такой пос-

ледовательности узел delta, номер которого идентичен первым

2n-2 номерам полей delta в этой последовательности, называется точ-

кой ветвления. Поле branches узла содержит список номеров первых

узлов всех последовательностей для которых он является точкой ветв-

ления. Этот список упорядочен по возрастанию номеров.

12.4.1. Пример

.

- 148 -

+-------------------------------------------------------------+

Ё Ё

Ё Head Ё

Ё Ё

Ё 2.1 Ё

Ё Ё Ё

Ё 1.3 -------- 1.3.1.1 Ё

Ё Ё Ё

Ё T Ё +----- 1.2.2.1 ----------- 1.2.2.2 Ё

Ё r Ё Ё Ё Ё

Ё u Ё Ё 1.2.2.1.1.1 Ё

Ё n Ё Ё Ё

Ё k Ё Ё Ё

Ё 1.2 -------- 1.2.1.1 ----------- 1.2.1.3 Ё

Ё Ё Ё

Ё Ё Branch Ё

Ё 1.1 Ё

Ё Ё

+-------------------------------------------------------------+

Рис. 24

12.5. Команды RCS

В следующую таблицу сведены все команды RCS. Все эти команды

описаны в "Utilities Reference".

-------------------------------------------------------------------

Команда: Описание:

-------------------------------------------------------------------

ci сохранение версии в RCS

со извлечение версии из RCS

ident идентификация файлов

rcs изменение атрибутов RCS-файла

rcsclean очищение рабочих файлов

rcsdiff сравнение RCS-версий

rcsmerge объединение RCS-версий

rlog печать регистрационных сообщений и другой информации

о RCS-файлах

-------------------------------------------------------------------

.

- 149 -