Система контроля версий Fossil.
Локальное применение.

Общие сведения

Иногда возникает необходимость в простом инструменте для приведения в порядок индивидуальной работы над программой, веб-сайтом или статьёй. Всё, что от него требуется, — фиксировать состояние проекта на разных этапах и давать возможность быстро вернуться к одной из предыдущих стадий, если в погоне за музой автор попал в творческий тупик. Желательно, чтобы для использования этого инструмента не требовалось создавать виртуальный мир с сервером базы данных и веб-сервером. Одним словом, нужна локальная система контроля версий.

В такой ситуации может выручить система Fossil. Несмотря на то, что Fossil — это действительно система (причём не только контроля версий), она:

Установка

Способ установки Fossil зависит от операционной системы целевого компьютера.

Для 64-битных операционных систем Linux: исполняемый файл можно загрузить с сайта проекта Fossil, но в большинстве случаев проще воспользоваться штатным менеджером пакетов — система Fossil присутствует в официальных программных репозиториях распространённых дистрибутивов. В крайнем случае можно собрать Fossil из исходных текстов.

Для операционных систем Windows надо загрузить zip-архив с исполняемым файлом, соответствующим разрядности операционной системы, с официального сайта, после чего извлечь из него исполняемый файл fossil.exe. Чтобы при работе с проектом не указывать полный путь к программе, её надо поместить в каталог, перечисленный в переменной окружения PATH.

На этом установку системы можно считать завершённой, можно приступать к работе над проектом.

Предупреждение

Настоятельно рекомендуется не бросаться в бой, очертя голову. Для испытания системы контроля версий (любой, не только Fossil) надо создать отдельный тестовый каталог с копиями файлов проекта, и опробовать работу системы на нём. Внедрять систему в работу можно только после того, как станет понятно её функционирование. В любом случае, надо обязательно сделать резервную копию всех файлов проекта на отдельном носителе информации. Это позволит избежать горького разочарования, если вдруг что-то пойдёт не так.

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

Система Fossil работает в предположении, что все составные части проекта находится внутри его рабочего каталога. То есть, что имеется некоторый каталог, в котором находятся все файлы проекта, подкаталоги, файлы подкаталогов и т. д. Допустим, что это — каталог D:\Work\Project1. Для хранения файлов репозиториев проектов (т. е. файлов, которые будут содержать всю информацию о проектах, в том числе историю их развития) желательно выделить отдельный каталог, например, E:\Fossil (рис. 1).

Fossil-репозиторий и рабочий каталог
Рис. 1. Использование системы контроля версий Fossil в локальном варианте. Рабочий каталог (справа) содержит исходные файлы проекта. Fossil-репозиторий (слева) хранит историю изменений проекта в точках сохранения.

Для использования системы 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 контролирует не все файлы из рабочего каталога, а только те, которые ей будут указаны. Чтобы посмотреть, какие файлы не контролируются, надо выполнить команду:

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 commit -m "Описание точки сохранения"

После выполнения этой команды в репозитории будет создана новая точка сохранения check-in, соответствующая текущему состоянию проекта.

Восстановление из репозитория (checkout)

Посмотреть список точек сохранения, имеющихся в репозитории проекта, можно с помощью команды:

fossil timeline

Будет выведен список точек сохранения с комментариями и идентификаторами в квадратных скобках. Точка сохранения, которой соответствует рабочий каталог, снабжена отметкой *CURRENT*.

Чтобы откатить состояние рабочего каталога к одной из точек сохранения, надо:

При необходимости последнюю команду можно многократно выполнять с разными идентификаторами, чтобы просмотреть состояние проекта на разных стадиях. Для удобства, если не хочется нарушать состояние в рабочем каталоге, для просмотра истории проекта можно создать временный каталог, например, D:\Work\Temp, в который выгружать исторические состояния проекта. Для этого надо:

Во временный каталог будут выгружены файлы проекта, соответствующие последней точке сохранения. Для просмотра других точек сохранения можно использовать команду fossil checkout, как было описано выше.

Главное — не увлечься и не запутаться, какой каталог рабочий, а какой — временный. С точки зрения системы Fossil, они равноправны, но при локальном использовании системы контроля версий лучше соблюдать принятое соглашение. По завершении работы с репозиторием во временном каталоге, его лучше закрыть:

fossil close

Работа с ответвлениями (branch)

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

fossil branch new br1 идентификатор

где br1 — название новой ветви развития проекта, идентификатор — идентификатор точки сохранения, которая выбрана в качестве основы этой ветви.

После этого надо переключить рабочий каталог на новую ветвь с помощью команды:

fossil checkout br1

Теперь можно продолжать работу над проектом, создавая по мере необходимости точки сохранения с помощью команды fossil commit. Они будут отражаться на созданной ветви.

Когда проблема, из-за которой произошёл откат к точке сохранения и создание ответвления, будет решена, надо вернуть разработку в основную ветвь, которая называется trunk. Для этого:

В результате такого слияния высока вероятность получения конфликта изменений, о чём сообщит последняя команда в виде WARNING: merge conflicts с перечислением файлов, в которых обнаружены взаимоисключающие правки. Эти файлы следует отредактировать так, чтобы устранить конфликт, после чего можно продолжать работу в обычном режиме.

Веб-интерфейс

Несмотря на то, что основной способ работы с Fossil предполагает использование командной строки, эта система предоставляет графический интерфейс. Точнее, веб-интерфейс, работающий на встроенном в Fossil веб-сервере (рис.2).

Дерево проекта Fossil
Рис. 2. Дерево истории развития проекта в веб-интерфейсе.

Для получения доступа к веб-интерфейсу надо ввести команду:

fossil ui

В результате её выполнения система Fossil перейдёт в режим веб-сервера, обрабатывающего запросы на локальном сетевом интерфейсе, и автоматически будет запущен установленный в операционной системе веб-браузер с его стартовой страничкой. Чтобы остановить работу веб-сервера, надо нажать комбинацию клавиш Ctrl+C.

Более полное представление о возможностях веб-интерфейса можно получить на сайте проекта Fossil — он целиком работает на движке последней версии системы.

Дополнительные материалы

Как уже было отмечено, возможности системы Fossil не ограничиваются контролем версий. Помимо этого, её можно использовать для:

Подробное описание перечисленных возможностей системы Fossil можно найти в книге: Орещенков И. С. Инструментальные средства разработки программного обеспечения. Система Fossil. — Cанкт-Петербург: Лань, 2021.