Copyright © 2005 Вячеслав Колдовский
Примечание: данная статья не предназначена для тех, кто уже использует у себя систему контроля версий (в частности, CVSNT+WinCVS), она направлена на ту аудиторию разработчиков, которые по той или другой причине не начали использовать систему контроля версий, но хотели бы это сделать. Статья поможет начать работать с системой контроля версий без лишних затрат времени на поиск подходящего продукта, изучение томов документации и получение опыта наиболее тяжелым путем – методом проб и ошибок.
Каждый программист сталкивался с проблемой хранения многих версий одних и тех же файлов или проектов целиком. Сама профессия программиста к этому располагает: разработка программного проекта обычно занимает продолжительное время и в большинстве случаев является итерационной. В связи с чем возникает необходимость хранить старые либо стабильные версии проекта доступные клиентам, а текущую работу выполнять над рабочей версией, которая обычно редко бывает в состоянии, полностью пригодном для использования.
Иногда задача усложняется: если в последней стабильной версии была обнаружена критическая ошибка, требующая немедленного устранения, а текущая рабочая версия к немедленному выпуску не готова, то необходимо открыть старые исходники, внести исправления там и, естественно, продублировать исправление в новых, если они также содержат эту ошибку. Так появляются ответвления, которые также нужно хранить отдельно.
Если же разработка ведется командой, то обойдись без специализированной системы управления версиями файлов практически невозможно: затраты времени и труда на согласование изменений, поиск необходимых версий и устранение конфликтов в одновременно измененных разработчиками файлах будут настолько велики, и их рост будет продолжаться быстрыми темпами при увеличении размера команды, что они просто станут основным препятствием на пути проекта.
Понятно, что если проблема существует, то должно существовать ее решение. Наверное, каждый программист слышал о системах контроля версий, которые как раз и предназначены для ее решения. Они позволяют решить не только проблему контроля версий, но и множество других: организовать резервное копирование, защитить от изменений файл, который уже изменяется другим разработчиком, обеспечить сравнение и слияние исходников. "Продвинутые" системы контроля версий обычно содержат встроенные, либо обеспечивают возможность интеграции с баг-трекерами, системами управления требованиями, системами обмена сообщениями.
Однако когда дело касается практики, то среди многообразия всех доступных решений сделать правильный выбор и начать безболезненное использование системы контроля версий представляется весьма непростой задачей.
Коммерческие решения оказываются весьма недешевыми, а те, которые доступны в качестве открытых проектов, отпугивают неискушенных пользователей сложностью настройки и эксплуатации.
Конечно, настоящему программисту любые сложности не преграда, но из-за них в ежедневной рутине переход систему контроля версий обычно откладывается "на потом".
Итак, рассмотрим, что из себя представляют системы контроля версий. Для этого нам понадобится ознакомиться со специальной терминологией.
Основу системы составляет репозиторий – центральное хранилище, которое содержит версии файлов. Очень часто репозиторий организуется средствами какой-нибудь СУБД.
Версия файла – состояние файла в определенный момент времени. Репозиторий предоставляет возможность хранить неограниченное число версий одного и того же файла.
Актуальная версия файла – обычно это самая последняя версия файла, размещенного в репозитории.
Рабочая версия файла – версия файла, с которой в текущий момент ведется работа, и которая не загружена в репозиторий.
Загрузка – размещение файла в репозитории. В процессе загрузки в репозиторий помещается рабочая версия файла.
Выгрузка – получение файла из репозитория. В процессе выгрузки осуществляется получение из репозитория необходимой версии файла.
Синхронизация – приведение в соответствие рабочих версий файлов с актуальными версиями в репозитории. В процессе синхронизации в репозиторий загружаются те файлы, рабочие копии которых являются более "свежими" (т.е. имеют более поздние версии), по сравнению с файлами в репозитории, и выгружаются те файлы, рабочие копии которых устарели по сравнению с копиями в репозитории.
Современные системы контроля версий работают не с отдельными файлами, а с их набором, который формирует проект, поэтому все приведенные термины справедливы и ко всему проекту целиком. Но, естественно, можно работать и на уровне отдельных файлов.
Работа с системой контроля версий производится следующим образом: вначале на локальном диске пользователя создаются папки и файлы, которые формируют рабочую копию проекта. Затем происходит процедура начальной загрузки, в процессе которой в репозитории системы контроля версий создается структура папок, соответствующая проекту, а также производится загрузка файлов проекта.
Далее, в процессе изменения рабочей копии проекта, следует периодически загружать обновленные файлы в репозиторий. Система контроля версий обладает средствами, позволяющими определить, какие файлы изменились, поэтому изменения не придется отслеживать вручную.
Когда возникает необходимость, то определенные версии файлов проекта или весь проект по состоянию на определенный момент времени можно выгрузить из репозитория в рабочую или любую другую папку.
Если над проектом одновременно работает несколько человек, то каждый из них должен периодически осуществлять синхронизацию, чтобы получать файлы, обновленные другими участниками проекта, а также загружать файлы, которые были обновлены им.
Естественно, что в процессе работы над проектом в репозиторий можно добавлять новые файлы и папки, а также удалять те из них, которые стали не нужны.
В текущий момент на рынке представлено достаточно много систем контроля версий различных производителей для различных платформ, обладающих разнообразной функциональностью и поставляющихся на различных условиях.
Мы рассмотрим применение одной из наиболее старейшей из них – системы CVS (Concurrent Versions System), однако полученные нами навыки будут полезны при работе с любой подобной системой. CVS возникла как продолжение более ранней системы контроля версий – RCS (Revision Control System) и является проектом с открытым исходным кодом. CVS не лишена определенных недостатков, во многом обусловленных ее почтенным возрастом, но все же на текущий момент она является одной из самых распространенных среди используемых систем контроля версий с открытым исходным кодом.
Сама CVS вышла их Unix-среды и лучше всего функционирует под управлением Unix-серверов, однако для Windows-среды существует отдельное ответвление данной системы – CVSNT. CVSNT также является открытым проектом и достаточно активно развивается, поэтому мы будем использовать именно данную систему.
Однако, как сама CVS, так и CVSNT в "чистом" виде являются системами командной строки, поэтому для их комфортного использования нам понадобится клиент с графическим интерфейсом пользователя. Очень популярным клиентом CVS и CVSNT с графическим интерфейсом пользователя для Windows-платформы является клиент WinCVS, который также представляет собой проект с открытым исходным кодом.
CVSNT и WinCVS чаще всего используются вместе, даже обычный дистрибутив WinCVS содержит в себе CVSNT. Однако это все же независимые проекты, которые независимо развиваются, поэтому мы будем рассматривать их установку по отдельности.
Вначале установим и настроим CVSNT. На момент написания статьи последней стабильной версией была 2.0.58d, получить которую можно по адресу: www.cvsnt.org.
Установку загруженного дистрибутива CVSNT произведем со всеми параметрами по умолчанию.
Далее приступим к настройке. Для настройки нам необходимо перейти к аплету панели управления "CVS for NT", который создается автоматически после установки дистрибутива.
В настройках аплета, на вкладке Repositiories необходимо задать путь и имя репозитория – централизованного хранилища, которое будет содержать различные версии наших документов. Для этого просто нажимаем кнопку Add и задаем путь к новой папке на жестком диске, например, c:\Repositories\Projects Repository, а также короткое имя в Unix-стиле со слешем вначале, например, /Projects. Нажимаем ОК и положительно отвечаем на появившийся запрос о необходимой инициализации.
Далее переходим к закладке Service Status и перезапускаем службу CVS Service последовательным нажатием кнопок Stop и Start.
На этом все действия по инициализации CVSNT заканчиваются.
Переходим к установке и настройке WinCVS.
WinCVS поставляется в двух вариантах: полная версия с интегрированным дистрибутивом CVSNT и т.н. bare-версия, в которой CVSNT нет. Так как мы загружали и устанавливали CVSNT отдельно, то нам нужна именно bare-версия. На момент написания статьи последней стабильной версией WinCVS была 1.3.20, получить ее можно по адресу: www.wincvs.org.
Установку загруженного дистрибутива WinCVS произведем со всеми параметрами по умолчанию.
После установки запускаем WinCVS и переходим к настройкам (меню Admin->Preferences). На вкладке CVS задаем путь к домашней папке (HOME), в которой CVSNT и WinCVS будут искать конфигурационные файлы, специфичные для каждого пользователя системы контроля версий. Для наших целей подойдет любая локальная папка, например, папка "Мои документы". И на этой же вкладке, отметив флажок Alternate CVS executable задаем путь к исполняемому файлу cvs.exe в папке, в которую была выполнена установка CVSNT (по умолчанию это путь: C:\Program Files\cvsnt\cvs.exe). На этом минимально необходимые настройки закончены, нажатием ОК закрываем окно настройки. Все остальные параметры, в зависимости от конкретных потребностей, можно будет задать позже.
На данный момент мы готовы приступить к непосредственной работе с системой контроля версий.
Первое, с чего следует начать – это перейти к папке, в которой хранятся файлы проекта. Сделать это можно, если нажать на кнопку с изображением папок рядом с выпадающим списком на панели инструментов Browse. В появившемся диалоговом окне выбираем папку и структура этой папки будет отображена в панели навигации слева, а путь к папке попадет в выпадающий список на панели инструментов, что облегчит доступ к ней в дальнейшем.
На скриншоте изображено главное окно WinCVS, в котором открыта папка C:\Projects.

Далее, нам необходимо внести папку с нашим проектом в репозиторий CVSNT. Для этого следует в окне браузера слева вызвать контекстное меню на имени папки Project и выбрать команду Import module....
На экране появится диалоговое окно Import filter.

В данном окне представлен перечень типов файлов, содержащихся в выбранной папке и всех вложенных в нее папках. Выбрав тип файла, и нажав кнопку Edit, можно задать действие, применяемое к файлам данного типа, или способ их обработки (текстовый, бинарный). В частности, определенный тип файлов (например, файлы с раширением .bak) можно исключить из процесса импорта в репозиторий.
Сообщение об ошибке "Error: File has some escape characters in it" можно игнорировать, это не более чем предупреждение о наличии в файлах не-ASCII символов.
После нажатия кнопки OK на экране появляется диалоговое окно Import settings, в котором необходимо задать параметры импорта файлов в репозиторий.

Отметим флажок Don't create vendor branch or release tags, чтобы отключить функцию, которая нам не нужна.
Далее, в поле CVSROOT необходимо задать параметры подключения к серверу CVSNT. Если нажать на кнопку с троеточием, то появится диалоговое окно, с помощью которого можно построить строку подключения к серверу.
Однако параметры подключения достаточно сложны, их подробное описание займет слишком много времени, поэтому в рамках данной статьи мы ограничимся только вводом следующей строки и ограничимся короткими комментариями: :sspi;hostname=localhost:/Projects. Строка состоит из имени используемого протокола (sspi), имени сервера, к которому выполняется подключение (в нашем случае псевдоним локального компьютера – localhost) и пути к репозиторию относительно начального каталога (/Projects). Обратите внимание на точное соответствие вводимых символов, в частности, знаков препинания.
В поле Enter the log message можно при желании ввести комментарии к импортируемым файлам, например, указать в каком состоянии в текущий момент находится проект.
Далее, на вкладе Import options следует обязательно отметить флажок Create CVS directories while importing, чтобы в процессе импорта в репозитории были созданы папки, соответствующие импортируемой структуре папок.
После нажатия кнопки OK файлы импортируются в репозиторий.
Итак, на текущий момент мы имеем рабочую копию наших файлов и осуществили начальную загрузку этой копии в репозиторий системы контроля версий.
Далее можно продолжать работать над нашими файлами, а когда возникнет необходимость, то измененные файлы можно загрузить в CVS.
Допустим, что мы изменили несколько файлов и хотели бы загрузить обновленные файлы в репозиторий.
Для этого следует снова запустить WinCVS (если окно программы было закрыто), либо нажать на кнопку Refresh, чтобы обновить представление на экране.
В главном окне WinCVS измененные файлы будут отображены со значком красного цвета (
), чтобы показать все файлы можно выбрать "плоский режим" (Flat Mode,
) в котором файлы из всех папок будут отображены в одном списке.

Обновление измененных файлов осуществляется следующим образом. Вначале следует выделить файлы, которые нужно внести в репозиторий, затем необходимо нажать кнопку Commit Selected (
). На экране появится диалоговое окно Commit settings, в котором можно задать дополнительные параметра загрузки, большинство из которых соответствуют параметрам уже знакомого нам окна Import settings.
Если систему контроля версий интенсивно используется для загрузки файлов в репозиторий, то рано или поздно возникнет необходимость выгрузить определенные версии файлов обратно. Также может возникнуть необходимость осуществить полную выгрузку всего проекта. Например, это может понадобиться участнику проекта, который работает вместе с вами.
Для осуществления данной процедуры выбираем команду меню Remote->Checkout module. На экране появится диалоговое окно Checkout settings.

Для выгрузки необходимо заполнить поля Module name and path on the server, Local folder to checkout to, CVSROOT. Поле Module name and path on the server должно содержать название модуля (папки или файла), который необходимо выгрузить из сервера, его можно задать вручную, либо построить автоматически, нажав кнопку с троеточием рядом с полем ввода, и вызвав диалоговое окно Select module (в этом окне можно указать и конкретную версию файла, которую необходимо выгрузить). Поле Local folder to checkout to должно содержать путь, по которому следует осуществить выгрузку. Поле CVSROOT должно содержать строку подключения к серверу (такую же, какую мы вводили ранее).
Для выгрузки отдельных файлов, а не целых папок, гораздо удобнее пользоваться графическим представлением версий файлов в репозитории. Для того чтобы отобразить окно графического представления версий, достаточно вызвать контекстное меню на имени требуемого файла и выбрать команду Graph....

В графическом представлении наглядно представлены номера версий выбранного файла. Для того чтобы выгрузить конкретную версию, достаточно вызвать на прямоугольнике с ее изображением контекстное меню и из него выбрать команду Retrieve revision. Обратите внимание, что номера версий присваиваются автоматически при загрузке файлов в репозиторий.
Использовать систему контроля версий можно не только для хранения программных проектов, но и для обычных документов. Работая попеременно то на стационарном компьютере, на котором установлен сервер системы контроля версий, то на ноутбуке, автор данной статьи оградил себя от возможных проблем, вызванных конфликтом изменений файлов, а заодно раз и навсегда решил проблему резервного копирования важной информации.
Приведенной в статье информации достаточно для того, чтобы выполнить только первые шаги в системе контроля версий. Для получения более глубоких знаний следует обратиться к дополнительным источникам информации, каких в онлайн можно встретить в большом количестве. Среди них следует отметить хороший документ "WinCVS – Руководство по каждодневному применению" (его русскоязычный вариант можно загрузить по адресу: getos.chat.ru/wincvs_rus.htm), а также флеш-ролик, демонстрирующий установку и настройку CVSNT и WinCVS и выполнение основных операций в системе контроля версий, который можно загрузить по адресу: www.wincvs.org.
CVSNT – хорошая система контроля версий, но она обладает многими особенностями, полученными в наследство от сравнительно устаревшей CVS, например, неудобной работой со структурой папок, неудобной выгрузкой файлов из репозитория. Если в процессе эксплуатации CVSNT возникнет ощущение, что эта система перестает устраивать по тем или иным параметрам, то можно присмотреться к другим альтернативам. Например, отличным открытым проектом, лишенным многих наследственных особенностей CVS является следующий проект одного из основателей CVS – Subversion (subversion.tigris.org). Subversion гораздо больше подходит для управления изменениями структуры папок, более эффективно хранит двоичные файлы, имеет стандартную возможность для того, чтобы "вернуться" на определенный момент времени в прошлом. Если говорить о коммерческих продуктах, то среди них много достойных решений, выделить среди которых следует Borland StarTeam (borland.com/starteam), ранее разрабатываемое компанией Starbase, которая была поглощена Borland в конце 2002 г. Текущая версия StarTeam – 2005. Также внимания заслуживают Perforce (perforce.com) и Sourcegear Vault (sourcegear.com/vault).
Copyright © 2005 Вячеслав Колдовский Специально для Delphi Plus