Mercurial
Mercurial — это распределённая система управления версиями (DVCS), предназначенная для эффективного отслеживания изменений в исходном коде и других файлах в процессе коллективной разработки программного обеспечения. Разработана как свободное и открытое программное обеспечение, распространяемое под лицензией GNU GPL версии 2. Основное отличие Mercurial от централизованных систем (например, Subversion) заключается в том, что каждый участник хранит полную копию репозитория, что позволяет работать автономно и обеспечивает высокую отказоустойчивость.
История
Проект Mercurial был начат в апреле 2005 года Оливье Мандэлем (Olivier Mengué) и Мэттом Макаллом (Matt Mackall) как ответ на отказ компании BitMover от бесплатного распространения системы BitKeeper, которой ранее пользовались разработчики ядра Linux. Первоначально система называлась «Mercurial» (от лат. mercurialis — «подвижный, изменчивый»), а также имела кодовое имя «hg» — химический символ ртути (Hydrargyrum). Первый публичный релиз (0.1) состоялся в июне 2005 года.
В 2006 году Mercurial был выбран для управления исходным кодом проекта OpenSolaris, а в 2007 году — для разработки ядра NetBSD. Наибольшую известность система получила благодаря использованию в проектах Mozilla (Firefox, Thunderbird) и в корпорации Facebook (продукт Meta, признанной экстремистской и запрещённой в РФ) (до перехода на Git в 2014 году). В 2012 году Mercurial стал основной системой контроля версий для платформы Google Code (позднее заменён на Git). С 2016 года популярность Mercurial начала снижаться на фоне доминирования Git, однако он продолжает применяться в ряде крупных проектов, включая некоторые инструменты разработки корпорации Microsoft и в научных исследованиях.
Архитектура и принципы работы
Распределённая модель
Mercurial использует распределённую модель, при которой каждый клон репозитория является полноценной копией с полной историей изменений. Это позволяет разработчикам работать без постоянного подключения к центральному серверу, а синхронизация происходит путём обмена наборами изменений (changesets) между репозиториями.
Хранение данных
История изменений хранится в виде направленного ациклического графа (DAG), где каждый узел — это набор изменений (ревизия), содержащий метаданные (автор, дата, комментарий) и ссылки на родительские ревизии. Данные сжимаются с использованием алгоритма zlib, а для эффективного хранения больших файлов применяется механизм «общих» блоков (revlog).
Производительность
Mercurial оптимизирован для работы с большими репозиториями и тысячами файлов. Основные операции (commit, diff, log) выполняются быстро благодаря локальному хранению данных и эффективному кэшированию. Размер репозитория обычно меньше, чем у Git, за счёт более агрессивного сжатия.
Команды и интерфейс
Система предоставляет консольный интерфейс с командами, начинающимися с префикса hg (например, hg init, hg clone, hg commit). Команды имеют мнемонические имена и короткие алиасы. Основные команды:
hg init— создание нового репозитория.hg clone— клонирование существующего репозитория.hg commit— фиксация изменений.hg push/hg pull— отправка/получение изменений.hg merge— слияние веток.hg log— просмотр истории.hg diff— сравнение версий.
Классификация и виды репозиториев
Mercurial поддерживает несколько типов репозиториев:
- Локальный репозиторий — хранится на локальном диске разработчика.
- Удалённый репозиторий — доступен по протоколам HTTP, HTTPS, SSH или через локальную файловую систему.
- Центральный репозиторий — используется в модели с единым сервером (например, в корпоративной среде), хотя архитектурно система остаётся распределённой.
- Клонированный репозиторий — точная копия другого репозитория, созданная командой
hg clone. - Временный репозиторий — используется для обмена изменениями между разработчиками без постоянного сервера.
Применение
Разработка программного обеспечения
Mercurial применяется для управления версиями в проектах, где требуется высокая надёжность и простота работы. Основные области использования:
- Ядро операционных систем — NetBSD, OpenSolaris (исторически).
- Веб-браузеры — Mozilla Firefox, Mozilla Thunderbird (до перехода на Git в 2020-х годах).
- Инструменты разработки — некоторые компоненты Microsoft Visual Studio и Azure DevOps (внутреннее использование).
- Научные вычисления — проекты, требующие точной фиксации версий алгоритмов и данных.
Интеграция с платформами
Mercurial поддерживается рядом хостинг-платформ, включая:
- Bitbucket (до 2020 года) — предоставлял бесплатные приватные репозитории.
- SourceForge — поддерживал Mercurial наряду с Git и Subversion.
- Google Code (закрыт в 2016 году) — использовал Mercurial как основную систему.
- Self-hosted решения — RhodeCode, Kallithea, Phabricator.
Особенности использования в России
В России Mercurial применяется в ряде государственных и коммерческих проектов, где требуется строгий контроль версий и возможность работы в закрытых сетях. Например, некоторые подразделения «Росатома» и «Ростеха» используют Mercurial для управления исходным кодом встроенного ПО и систем управления. Также система популярна среди разработчиков, работающих с большими объёмами данных (например, в научных институтах РАН).
Сравнение с другими системами
Mercurial vs Git
Обе системы являются распределёнными, но имеют различия:
| Характеристика | Mercurial | Git |
|---|---|---|
| Интерфейс | Проще, меньше команд | Более гибкий, но сложнее |
| Производительность | Выше при работе с большими файлами | Выше при работе с большим количеством мелких файлов |
| Модель ветвления | Ветки — это именованные наборы изменений | Ветки — это указатели на коммиты |
| Поддержка Windows | Нативная (через MSYS2) | Нативная (через Git for Windows) |
| Популярность | Ниже | Доминирует (>90% проектов) |
Mercurial vs Subversion
Subversion — централизованная система, Mercurial — распределённая. Mercurial предоставляет автономную работу, лучшую поддержку ветвления и слияния, а также более высокую надёжность за счёт отсутствия единой точки отказа.
Критика и ограничения
Основные недостатки Mercurial:
- Меньшая распространённость — меньшее количество инструментов, плагинов и учебных материалов по сравнению с Git.
- Сложность слияния — в некоторых сценариях (например, при частом перебазировании) слияние может быть менее удобным, чем в Git.
- Отсутствие поддержки «сценарных» операций — Git предоставляет более гибкий API для автоматизации (через хуки и алиасы).
- Ограниченная поддержка хостинг-платформ — после закрытия поддержки Mercurial на Bitbucket и GitHub количество доступных сервисов сократилось.
Интересные факты
- Название «Mercurial» происходит от имени бога Меркурия, символизирующего скорость и подвижность.
- Кодовое имя «hg» (ртуть) выбрано из-за того, что ртуть — жидкий металл, а система управления версиями «текучая» и изменчивая.
- Mercurial был написан на Python, что обеспечило его кроссплатформенность и простоту расширения.
- Разработчики Mozilla использовали Mercurial для управления кодом Firefox более 10 лет, создав для него множество расширений (например,
hg-gitдля взаимодействия с Git-репозиториями). - В 2014 году Facebook перевёл свои проекты с Mercurial на Git, но часть внутренних инструментов (например, для анализа кода) продолжала использовать Mercurial до 2020 года.
Источники
- Mackall, M. (2006). Mercurial: A Distributed Version Control System. Proceedings of the Linux Symposium.
- O’Sullivan, B. (2009). Mercurial: The Definitive Guide. O’Reilly Media.
- Документация Mercurial (официальный сайт проекта).
- История проекта на сайте Mercurial Wiki.
- Статьи на OpenNET и Habr о сравнении систем управления версиями.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →