Текст книги "Основы программирования в Linux"
Автор книги: Нейл Мэтью
Соавторы: Ричард Стоунс
Жанры:
Программирование
,сообщить о нарушении
Текущая страница: 35 (всего у книги 67 страниц)
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
$
Разрешается применять множественные строки комментариев. Завершите строку приглашения одиночной точкой (.
) в самой строке или набрав символ конца файла, обычно комбинацией клавиш
После этой команды 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
#include
/*
Это важный файл для управления данным проектом.
В нем реализована каноническая программа «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
#include
/*
Это важный файл для управления данным проектом.
В нем реализована каноническая программа «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
, со
и т.д.
Система SCCS предлагает средства, очень похожие на средства системы RCS. Преимущество системы SCCS лишь в том, что она определена в стандарте X/Open, поэтому все версии UNIX известных производителей должны ее поддерживать. С практической точки зрения система RCS предпочтительнее, она легко переносится на разные платформы и распространяется бесплатно. Поэтому, если у вас UNIX-подобная система, независимо от ее отображения на стандарт X/Open, вы сможете получить для нее и установить в ней систему RCS. По этой причине мы не будем описывать далее в книге систему SCCS, лишь приведем краткое сравнение команд, имеющих аналоги в обеих системах.
Сравнение RCS и SCCSТрудно провести прямую аналогию между командами двух систем, поэтому табл. 9.2 следует рассматривать как краткий указатель. У команд, перечисленных в таблице, разные опции для выполнения одних и тех же задач. Если вы должны применять систему SCCS, следует найти соответствующие опции, но, по крайней мере, вы будете знать, где их искать.
Таблица 9.2
rcs | admin |
ci | delta |
со | get |
rcsdiff | sccsdiff |
ident | what |
В дополнение к только что перечисленным командам у команды sссs
одноименной системы есть некоторое пересечение с командами rcs
и со
системы RCS. Например, команды sссs edit
и sссs create
эквивалентны командам со -l
и rcs -i
соответственно.
Альтернатива применения системы RCS для управления изменениями в файлах – система CVS, которая означает Concurrent Versions System (система параллельных версий). CVS стала очень популярной, может быть, потому, что у нее есть одно явное преимущество по сравнению с системой RCS: на практике CVS используется в Интернете, а не только в совместно используемом локальном каталоге как RCS. В системе CVS также разрешены параллельные разработки, т. е. многие программисты могут работать с одним и тем же файлом одновременно, в то время как RCS разрешает лишь одному пользователю работать с конкретным файлом в определенный момент времени. Команды CVS похожи на команды RCS, поскольку первоначально CVS была разработана как внешний интерфейс RCS.
Поскольку она способна гибко функционировать в сети, система CVS подходит для применения в тех случаях, когда у разработчиков есть единственная связь – через Интернет. Многие проекты Linux и GNU используют систему CVS, чтобы помочь разработчикам координировать их работу. В основном использование CVS для управления удаленными файлами аналогично применению системы для обработки локальных файлов.
В этой главе мы кратко рассмотрим основы системы CVS, чтобы вы могли начать работать с локальными репозитариями и понимали, как получить копию самых свежих исходных файлов проекта, если сервер CVS доступен в Интернете. Дополнительная информация хранится в руководстве по CVS, написанном Пером Седерквистом (Per Cederqvist) и др. и доступном по адресу http://ximbiot.com/cvs/manual/, там вы найдете файлы FAQ (часто задаваемые вопросы) и другие полезные файлы.
Прежде всего, вы должны создать репозитарий или хранилище, в котором CVS будет хранить свои управляющие файлы и основные копии файлов, управляемые ею. У репозитария древовидная структура, поэтому можно применять один репозитарий для хранения целиком всей структуры каталогов, предназначенных не только для одного проекта, но и для нескольких проектов. Для несвязанных проектов можно использовать и отдельные репозитарий. В следующих разделах вы увидите, как сообщить системе CVS о том, какой репозитарий применять.
Локальное использование CVS
Начните с создания репозитария. Для простоты пусть это будет локальный репозитарий, и поскольку вы будете использовать только один, удобно поместить его в каталог /usr/local. В большинстве дистрибутивов Linux все обычные пользователи являются членами группы users, поэтому примените ее как группу репозитария, чтобы у всех пользователей был доступ к нему.
Как суперпользователь создайте каталог для репозитария:
# mkdir /usr/local/repository
# chgrp users /usr/local/repository
# chmod g+w /usr/local/repository
И превратившись снова в обычного пользователя, инициализируйте его как репозитарий CVS. У вас должно быть право на запись в каталог usr/local/repository, если вы не входите в группу обычных пользователей.
$ cvs -d /usr/local/repository init
Опция -d
информирует CVS о том, где вы хотите создать репозитарий.
После создания репозитария можно сохранить начальные версии файлов проекта в системе CVS. Но в этот момент можно сэкономить на наборе. У всех команд cvs
есть два способа поиска каталога системы CVS. Во-первых, они ищут опцию -d <путь>
в командной строке (как и в команде init
), если опций -d
нет, ищется переменная окружения CVSROOT
. Вместо постоянного применения опции -а вы задаете переменную окружения. Приведенную далее команду можно использовать, если в качестве командной оболочки вы применяете bash:
$ export CVSROOT=/usr/local/repository
Прежде всего, вы изменяете каталог, в котором находится проект; далее вы сообщаете CVS о необходимости импортировать все файлы проекта в этот каталог. Для системы CVS проект – это любая коллекция связанных файлов и каталогов. Обычно она включает все файлы, необходимые для создания приложения. Термин «импорт» означает передачу всех файлов под контроль системы CVS и копирование их в CVS-репозитарий. В данном примере у вас есть каталог cvs-sp (простой проект CVS), содержащий два файла – hello.c и Makefile.
$ cd cvs-sp
$ ls -l
-rw-r–r– 1 neil users 68 2003-02-15 11:07 Makefile
-rw-r–r– 1 neil users 109 2003-02-15 11:04 hello.c
Команда импорта в CVS (cvs import
) применяется следующим образом:
$ cvs import -m"Initial version of Simple Project" wrox/chap9-cvs wrox start
Это заклинание заставляет CVS импортировать все файлы в текущий каталог (cvs-sp) и передает системе регистрационное сообщение (log message).
Аргумент wrox/chap9-cvs
информирует CVS о том, где относительно корня дерева CVS сохранять новый проект. Напоминаем, что при желании в одном репозитарии можно хранить несколько проектов. Параметр wrox
– тег поставщика, применяемый для идентификации автора первоначальной версии импортируемых файлов, а start
– тег версии. Теги версии можно применять для идентификации в виде группы наборов связанных файлов, создающих конкретную версию приложения. Система CVS отвечает строками
N wrox/chap9-cvs/hello.c
N wrox/chap9-cvs/Makefile
Nо conflicts created by this import
информируя вас о том, что два файла импортированы корректно.
Сейчас самое время проверить возможность извлечения ваших файлов из системы CVS. Вы можете создать каталог junk и вернуть в него файлы, чтобы убедиться в том, что все нормально:
$ mkdir junk
$ cd junk
$ cvs checkout wrox/chap9-cvs
U wrox/chap9-cvs/Makefile
U wrox/chap9-cvs/hello.с
Вы указываете CVS тот же путь, что и при копировании файлов в репозитарий. Система CVS создает в текущем каталоге каталог wrox/chap9-cvs и помещает туда файлы.
Теперь вы готовы внести некоторые изменения в ваш проект. Отредактируйте файл hello.c в каталоге wrox/chap9-cvs, вставив в него строку
printf(«Have a nice dayn»);
Затем откомпилируйте заново и выполните программу, чтобы убедиться в том, что все в порядке:
$ make
сс hello.c -о hello
$ ./hello
Hello World
Have a nice day
$
Вы можете спросить у системы CVS о том, что изменилось в проекте. Не нужно сообщать CVS, какой именно файл вас интересует, она может работать со всем каталогом одновременно.
$ cvs diff
CVS отвечает следующими строками:
cvs diff: Diffing
Index: hello.c
========================================================
RCS file: /usr/local/repository/wrox/chap9-cvs/hello.c,v
retrieving revision 1.1.1.1
diff -r1.1.1.1 hello.c
6a7
> printf(«Have a nice dayn»);
Вы довольны внесенным изменением и хотите зафиксировать его в CVS.
Когда вы фиксируете изменение с помощью системы CVS, она запускает редактор, позволяющий вам ввести регистрационное сообщение. У вас есть возможность задать переменную окружения CVSEDITOR
для запуска определенного редактора перед выполнением команды commit
:
$ cvs commit
CVS сообщает о том, что она сохраняет:
cvs commit: Examining
Checking in hello.c;
/usr/local/repository/wrox/chap9-cvs/hello.c,v <– hello.c
new revision: 1.2; previous revision: 1.1
done
Теперь вы можете запросить систему CVS об изменениях в проекте со времени его первого сохранения в репозитарии. Запросите набор изменений в каталоге wrox/chap9-cvs, начиная с версии 1.1 (начальная версия):
$ cvs rdiff -r1.1 wrox/chap9-cvs
Система CVS сообщает следующие подробности:
cvs rdiff: Diffing wrox/chap9-cvs
Index: wrox/chap9-cvs/hello.c
diff -с wrox/chap9-cvs/hello.с:1.1 wrox/chap9-cvs/hello.с:1.2
*** wrox/chap9-cvs/hello.с:1.1 Mon Jul 9 09:37:13 2007
– wrox/chap9-cvs/hello.с Mon Jul 9 09:44:36 2007
************
*** 4,8 ****
– 4,9 –
int main() {
printf(«Hello Worldn»);
+ printf(«Have a nice dayn»);
exit (EXIT_SUCCESS);
}
Предположим, что у вас есть копия, извлеченная из системы CVS в локальный каталог на время, и вы хотите обновить файлы в вашем локальном каталоге, которые корректировались другими пользователями, а вы сами их не редактировали. CVS может сделать это для вас, применив команду update
. Перейдите на верхний уровень пути, в данном случае в каталог, содержащий каталог wrox, и выполните следующую команду:
$ cvs update -Pd wrox/chap9-cv3
CVS обновит файлы, извлекая из репозитария файлы, измененные другими пользователями, а не вами, и помещая их в ваш локальный каталог. Конечно, некоторые изменения могут оказаться несовместимыми с вашими, но это проблема, над которой вам придется потрудиться. Система CVS хороша, но она не умеет творить чудеса!
К этому моменту вы уже увидели, что использование CVS очень похоже на применение RCS. Но у нее есть существенное отличие, о котором мы пока не. упоминали, – способность функционировать в сети без смонтированной файловой системы.
Доступ к CVS по сети
Вы сообщили системе CVS, где находится репозитарий, применяя опцию -d
в каждой команде или установив переменную окружения CVSROOT
. Если вы хотите действовать через сеть, то просто используете расширенную синтаксическую запись для этого параметра. Например, во время написания книги все исходные файлы разработки GNOME (GNU Network Object Model Environment, сетевая объектная среда GNU – популярная графическая настольная система с открытым исходным кодом) были доступны в Интернете благодаря системе CVS. Вам нужно только задать месторасположение подходящего CVS-репозитария, указав некоторую сетевую информацию перед спецификатором пути к нему.
Другим примером может служить указание на CVS-репозитарий Web-стандартов консорциума W3C, значение переменной CVSROOT
при этом должно быть равно :pserver:[email protected]:/sources/public
. Оно информирует систему CVS о том, что для доступа к репозитарию применяется аутентификация (pserver) с паролем и что репозитарий находится на сервере по адресу dev.w3.org.
Прежде чем получить доступ к исходным файлам, следует зарегистрироваться следующим образом:
$ export CVSROOT=:pserver:[email protected]:/sources/public
$ cvs login
Когда появится приглашение для ввода пароля, введите anonymous
.
Теперь вы готовы применять команды cvs во многом так же, как при работе с локальным каталогом, за исключением того, что следует добавлять опцию -z3
ко всем командам cvs
, чтобы добиться сжатия для экономии полосы пропускания сети.
Если вы хотите получить исходные файлы HTML-валидатора W3C (системы проверки допустимости HTML-файлов), наберите приведенную далее команду:
$ cvs -z3 checkout validator
Если хотите сделать доступным в сети собственный репозитарий, необходимо запустить CVS-сервер на своей машине. Сделать это следует с помощью супердемона xinetd
или inetd
в зависимости от конфигурации вашей ОС Linux. Для применения хinetd
отредактируйте файл /etp/xinetd.d/cvs, указав в нем местоположение CVS-репозитария, и воспользуйтесь средством настройки системы для активизации и запуска сервиса cvs. Для применения супердемона inetd
просто добавьте строку в файл etc/inetd.conf и перезапустите inetd
. Далее приведена необходимая строка:
2401 stream tcp nowait root /usr/bin/cvs cvs -b /usr/bin –allow-root=/usr/local/repository pserver
Она информирует inetd
об автоматическом запуске CVS-сеанса для клиентов, подключающихся к порту 2401, стандартному порту CVS-сервера. Дополнительную информацию о запуске сетевых сервисов с помощью супердемона inetd
см. в интерактивном справочном руководстве к inetd
и inetd.conf.
Для использования системы CVS с вашим репозитарием и сетевым доступом к нему вы должны задать соответствующее значение переменной окружения CVSROOT
. Например,
$ export CVSFOOT=:pserver:neil@localhost:/usr/local/repository
В этом коротком разделе мы смогли дать лишь поверхностное описание функциональных возможностей системы CVS. Если вы хотите основательно познакомиться с этой системой, настоятельно рекомендуем установить локальный репозитарий для экспериментов, найти расширенную документацию по CVS и получать удовольствие! Помните, что это система с открытым кодом, поэтому, если вы столкнулись с непонятными действиями программы или (что невероятно, но возможно) думаете, что обнаружили ошибку, всегда можно получить исходный программный код и изучить его самостоятельно. Начальная страница CVS расположена по адресу http://ximbiot.com/cvs/cvshome/.
Внешние интерфейсы CVS
Для доступа к CVS-репозитариям существует множество графических внешних интерфейсов. Может быть, их лучшую коллекцию для разных операционных систем можно найти на Web-сайте http://www.wincvs.org/. Там есть клиентское программное обеспечение для ОС Windows, Macintosh и, конечно, Linux.
Клиентская часть CVS позволяет создавать репозитарий и управлять им, включая удаленный доступ к репозитариям по сети.
На рис. 9.1 показана хронология работы с нашим простым приложением, отображенная WinCVS на сетевом клиенте под управлением ОС Windows.
Рис. 9.1