Постоянные читатели помнят про мои отношения с Fossil. Fossil – это распределенная система контроля версий со встроенным багтрекером, вики, и просмотрщиком документации; по сути, Git + GitHub в одном исполняемом файле размером примерно в полтора мегабайта, только лучше, потому что тикеты и вики, как и код, распределенные, а не сидящие на одном сервере, а веб-интерфейс доступен даже в офлайне. Fossil написал Ричард Хипп, автор SQLite.

Я часто пользуюсь почти всеми известными DVCS (например, Git для моих пакетов Go потому что goinstall его поддерживает, Mercurial для нескольких проектов и работы над Go), и мои персональные проекты постоянно мигрируют с одной DVCS на другую, но только Fossil мне как родной. Им реально просто и удобно пользоваться, и я на 100% уверен, что информация, лежащая в репозитории не повреждена (привет, Mercurial!).

Конечно, и у Fossil были и есть недостатки. Но на то он и опенсорсный проект (с BSD лицензией, кстати, а не GPL, как почти все остальные), чтобы мы могли их устранять ;-). Пару лет назад, например, я добавил поддержку SSL/TLS.

Я как-то жаловался здесь, что Fossil не поддерживает симлинки. Они важны для некоторых моих мак-проектов – я храню в репозитории скомпилированные фреймворки (зачем – отдельный вопрос), а фреймворк в Mac OS X – это директория, в которой есть несколько ссылок. Пожаловался, и забыл. А потом, когда в начале этого года вернулся к Fossil после путешествий по другим DVCS, все-таки начал работать над поддержкой симлинков. Сделал перерыв на весну и лето, и недавно закончил – бранч смёрджили в транк (привет русскому языку) и сегодня вышла версия 1.20, в которой симлинки есть (включаются опцией «allow-symlinks»).

Вторым пунктом моей жалобы была производительность коммитов и добавления файлов. С тех пор в Fossil заменили код SHA-1 на более скоростной, я улучшил время добавления кучи файлов на ~30% простым патчем. Тем не менее, производительность все равно хуже, чем у идеала – Git – но, большое НО, это из-за специальных параноидальных проверок (которые можно отключить, но лучше не надо). Они описаны в этом документе, но я кратко расскажу тут. Во-первых, Fossil кроме высчитывания SHA-1 отдельных файлов еще считает MD5 всех файлов в коммите, а так же самого манифеста коммита (списка файлов с SHA-1 хэшами и разными свойствами, типа тэгов и бранчей). Во-вторых, после дельта-кодирования артефактов, перед тем, как сделать COMMIT транзакции в репозиторий (да, коммиты в Fossil атомарные), Fossil пробует обратно восстановить артефакты и посчитать их контрольную сумму; если получилось, коммит удался. Естественно, все эти действия, хоть и очень быстры, приводят к тому, что производительность коммита – чуть медленней, чем у Git или Mercurial, которые не делают таких проверок. (Чтобы вы не пугались, я говорю о разнице в полсекунды, а не десятки секунд.) Но именно из-за этих проверок, я могу быть уверен, что история проекта – именно такая, какая есть, нигде ничего не испорчено.

Еще из хороших фич в версии 1.20: side-by-side diffs (пример) и всякие улучшения security. Полный changelog тут.

В общем, качайте Fossil 1.20. Никаких сложных установок – всего один исполняемый файл. На сервер тоже устанавливать проще, чем другие VCS, поддерживается даже обычный shared hosting с CGI.

Кстати, почти все опенсорсные проекты на http://www.codingrobots.org теперь хостятся именно Fossil-ом (каждый сайт проекта и есть репозиторий). Мак-юзерам пригодится QLFossil для удобного просмотра репозиториев в Finder.