Система контроля версий Fossil.
Локальное применение.
Общие сведения
Иногда возникает необходимость в простом инструменте для приведения в порядок индивидуальной работы над программой, веб-сайтом или статьёй. Всё, что от него требуется, — фиксировать состояние проекта на разных этапах и давать возможность быстро вернуться к одной из предыдущих стадий, если в погоне за музой автор попал в творческий тупик. Желательно, чтобы для использования этого инструмента не требовалось создавать виртуальный мир с сервером базы данных и веб-сервером. Одним словом, нужна локальная система контроля версий.
В такой ситуации может выручить система Fossil. Несмотря на то, что Fossil — это действительно система (причём не только контроля версий), она:
- проста в установке и обслуживании — представляет собой единственный исполняемый файл размером около 7 Мб (около 3 Мб в архиве), который можно просто копировать на целевой компьютер;
- хранит все данные проектов (репозитории) в отдельных файлах, которые внутри имеют структуру базы данных Sqlite и могут свободно переноситься между компьютерами простым копированием;
- может использоваться как в сетевом варианте (не уступая по функциональности таким распределённым системам версий, как git и mercurial), так и локально (для индивидуальной разработки);
- распространяется вместе с исходными текстами по либеральной лицензии BSD, допускающей использование Fossil в том числе и в коммерческих целях без уплаты каких бы то ни было вознаграждений (то есть бесплатно).
Установка
Способ установки Fossil зависит от операционной системы целевого компьютера.
Для 64-битных операционных систем Linux: исполняемый файл можно загрузить с сайта проекта Fossil, но в большинстве случаев проще воспользоваться штатным менеджером пакетов — система Fossil присутствует в официальных программных репозиториях распространённых дистрибутивов. В крайнем случае можно собрать Fossil из исходных текстов.
Для операционных систем Windows надо загрузить zip-архив с исполняемым файлом, соответствующим разрядности операционной системы, с официального сайта, после чего извлечь из него исполняемый файл fossil.exe. Чтобы при работе с проектом не указывать полный путь к программе, её надо поместить в каталог, перечисленный в переменной окружения PATH.
На этом установку системы можно считать завершённой, можно приступать к работе над проектом.
Предупреждение
Настоятельно рекомендуется не бросаться в бой, очертя голову. Для испытания системы контроля версий (любой, не только Fossil) надо создать отдельный тестовый каталог с копиями файлов проекта, и опробовать работу системы на нём. Внедрять систему в работу можно только после того, как станет понятно её функционирование. В любом случае, надо обязательно сделать резервную копию всех файлов проекта на отдельном носителе информации. Это позволит избежать горького разочарования, если вдруг что-то пойдёт не так
.
Подготовка к работе
Система Fossil работает в предположении, что все составные части проекта находится внутри его рабочего каталога. То есть, что имеется некоторый каталог, в котором находятся все файлы проекта, подкаталоги, файлы подкаталогов и т. д. Допустим, что это — каталог D:\Work\Project1. Для хранения файлов репозиториев проектов (т. е. файлов, которые будут содержать всю информацию о проектах, в том числе историю их развития) желательно выделить отдельный каталог, например, E:\Fossil (рис. 1).
Для использования системы Fossil в работе над проектом, надо:
- создать новый файл репозитория для проекта:
fossil init -A SetupUser E:\Fossil\Project1.fossil - сделать текущим рабочий каталог проекта:
cd D:\Work\Project1 - создать связь между рабочим каталогом и файлом репозитория:
fossil open -k E:\Fossil\Project1.fossil
С этого момента между рабочим каталогом D:\Work\Project1 и файлом репозитория E:\Fossil\Project1.fossil установлена связь, сведения о которой хранятся в файле D:\Work\Project1\_FOSSIL_ (или в файле .fslckout, если операционная система — не Windows). Рабочий каталог можно перемещать в другое место файловой системы, а файл репозитория — нельзя, потому что путь к файлу репозитория, содержащийся в файле _FOSSIL_ рабочего каталога, станет неправильным.
В дальнейшем при выполнении команды fossil текущим должен быть рабочий каталог проекта, связанный с репозиторием. В противном случае Fossil не сможет определить, по отношению к какому проекту/репозиторию выполнять запрошенные действия, и будет выводить сообщение:
current directory is not within an open checkout
Чтобы упростить дальнейшую работу, можно сразу выполнить несколько настроек:
- указать пользователя
по умолчанию
:fossil user default SetupUser - разрешить использование перевода строки CR/LF в исходных файлах проекта:
fossil settings crlf-glob '*' - разрешить использование различных кодировок для исходных файлов:
fossil settings encoding-glob '*'
Установка контроля
Система Fossil контролирует не все файлы из рабочего каталога, а только те, которые ей будут указаны. Чтобы посмотреть, какие файлы не контролируются, надо выполнить команду:
fossil extras
Команда для начальной установки контроля над исходными файлами проекта может быть такой:
fossil add --ignore *.obj,*.lib,*.exe *
С помощью опции --ignore через запятую указаны маски файлов, контролировать которые не требуется, чтобы не засорять репозиторий. В приведенном примере это — двоичные файлы, которые генерируются из исходных текстов компилятором. Символ звёздочки, указанный в конце командной строки, обозначает необходимость установки контроля над всеми остальными файлами во всех подкаталогах.
Загрузка в репозиторий (commit)
В ходе работы над проектом могут добавляться новые файлы, удаляться изменяться ранее существующие файлы. Оценить текущее состояние файлов в рабочем каталоге проекта относительно содержимого, сохранённого в репозитории можно с помощью команд:
fossil extras
fossil changes
Первая команда показывает, какие новые файлы появились в рабочем каталоге проекта (точнее, над какими файлами нет контроля системы Fossil). Вторая команда показывает, какие из контролируемых системой Fossil файлов были удалены из рабочего каталога (они отмечаются словом MISSING
), в какие были внесены изменения (отмечаются словом EDITED
), а какие были добавлены (с пометкой ADDED
). Отсутствующие файлы, над которыми установлен контроль системы Fossil, препятствуют загрузке состояния проекта в репозиторий.
Допустим, на очередном шаге развития проекта было добавлен файл gui/menu.c, а файл engine/integral.c был удалён. Тогда для актуализации контроля системы Fossil над содержимым каталога надо:
- установить контроль над добавленным файлом:
fossil add gui/menu.c - снять контроль с удалённого файла:
fossil forget engine/integral.c
Последняя команда позволяет в том числе снять контроль и с файла, который присутствует в рабочем каталоге, но тогда его изменения перестанут сохраняться в репозитории.
Чтобы сохранить текущее состояние проекта в репозиторий, надо выполнить команду:
fossil commit -m "Описание точки сохранения"
После выполнения этой команды в репозитории будет создана новая точка сохранения
check-in, соответствующая текущему состоянию проекта.
Восстановление из репозитория (checkout)
Посмотреть список точек сохранения, имеющихся в репозитории проекта, можно с помощью команды:
fossil timeline
Будет выведен список точек сохранения с комментариями и идентификаторами в квадратных скобках. Точка сохранения, которой соответствует рабочий каталог, снабжена отметкой *CURRENT*
.
Чтобы откатить
состояние рабочего каталога к одной из точек сохранения, надо:
- сохранить в репозитории текущее состояние рабочего каталога, чтобы не потерять последние изменения:
fossil commit -m "описание последних изменений" - выгрузить из репозитория в рабочий каталог состояние, соответствующее точке сохранения идентификатор:
fossil checkout идентификатор
При необходимости последнюю команду можно многократно выполнять с разными идентификаторами, чтобы просмотреть состояние проекта на разных стадиях. Для удобства, если не хочется нарушать состояние в рабочем каталоге, для просмотра истории проекта можно создать временный каталог, например, D:\Work\Temp, в который выгружать исторические состояния проекта. Для этого надо:
- сделать временный каталог текущим:
cd D:\Work\Temp - открыть во временном каталоге репозиторий проекта:
fossil open E:\Fossil\Project1.fossil
Во временный каталог будут выгружены файлы проекта, соответствующие последней точке сохранения. Для просмотра других точек сохранения можно использовать команду fossil checkout, как было описано выше.
Главное — не увлечься и не запутаться, какой каталог рабочий, а какой — временный. С точки зрения системы Fossil, они равноправны, но при локальном использовании системы контроля версий лучше соблюдать принятое соглашение. По завершении работы с репозиторием во временном каталоге, его лучше закрыть:
fossil close
Работа с ответвлениями (branch)
Если после анализа сохранённых в репозитории состояний проекта решено вернуться к одному из них и на его основе продолжать разработку, то надо создать ответвление командой:
fossil branch new br1 идентификатор
где br1 — название новой ветви развития проекта, идентификатор — идентификатор точки сохранения, которая выбрана в качестве основы этой ветви.
После этого надо переключить рабочий каталог на новую ветвь с помощью команды:
fossil checkout br1
Теперь можно продолжать работу над проектом, создавая по мере необходимости точки сохранения с помощью команды fossil commit. Они будут отражаться на созданной ветви.
Когда проблема, из-за которой произошёл откат
к точке сохранения и создание ответвления, будет решена, надо вернуть разработку в основную ветвь, которая называется trunk. Для этого:
- сохраняются последние изменения в текущей ветви br1:
fossil commit -m "описание изменений" - осуществляется переключение рабочего каталога на основную ветвь trunk:
fossil checkout trunk - ответвление br1
вливается
в основную ветвь:fossil merge br1
В результате такого слияния высока вероятность получения конфликта изменений, о чём сообщит последняя команда в виде WARNING: merge conflicts
с перечислением файлов, в которых обнаружены взаимоисключающие правки. Эти файлы следует отредактировать так, чтобы устранить конфликт, после чего можно продолжать работу в обычном режиме.
Веб-интерфейс
Несмотря на то, что основной способ работы с Fossil предполагает использование командной строки, эта система предоставляет графический интерфейс. Точнее, веб-интерфейс, работающий на встроенном в Fossil веб-сервере (рис.2).
Для получения доступа к веб-интерфейсу надо ввести команду:
fossil ui
В результате её выполнения система Fossil перейдёт в режим веб-сервера, обрабатывающего запросы на локальном сетевом интерфейсе, и автоматически будет запущен установленный в операционной системе веб-браузер с его стартовой страничкой. Чтобы остановить работу веб-сервера, надо нажать комбинацию клавиш Ctrl+C.
Более полное представление о возможностях веб-интерфейса можно получить на сайте проекта Fossil — он целиком работает на движке последней версии системы.
Дополнительные материалы
Как уже было отмечено, возможности системы Fossil не ограничиваются контролем версий. Помимо этого, её можно использовать для:
- ведения учёта заявок на доработку (bug tracking system);
- документирования проекта (wiki);
- коммуникаций (forum);
- веб-хостинга проекта (web server).
Подробное описание перечисленных возможностей системы Fossil можно найти в книге: Орещенков И. С. Инструментальные средства разработки программного обеспечения. Система Fossil. — Cанкт-Петербург: Лань, 2021.