Mercurial
Mercurial | |
---|---|
![]() | |
![]() | |
Тип | распределённая система управления версиями[вд] |
Разработчик | Matt Mackall |
Написана на | Python, Си и Rust |
Операционная система | кроссплатформенность |
Первый выпуск | 19 апреля 2005[1] |
Последняя версия | |
Бета-версия | |
Репозиторий | repo.mercurial-scm.org/h… |
Лицензия | GNU GPL 2+[вд][7] |
Сайт | mercurial-scm.org (англ.) |
![]() |
Mercurial (с англ. — «ртутный, подвижный»), он же Hg (от обозначения химического элемента ртути) — кроссплатформенная распределённая система управления версиями, разработанная для эффективной работы с очень большими репозиториями кода. В первую очередь она является консольной программой.
Mercurial появился в результате того же конфликта, что привёл к созданию Git. Автором новой системы стал Мэт Мэкол (Matt Mackall).
Описание
[править | править код]Система Mercurial написана на Python, хотя чувствительные к производительности части (например, своя реализация diff) выполнены в качестве модулей-расширений на C[8]. Для повышения производительности также используется Rust.[9] Mercurial первоначально была написана для Linux, позже портирована под Windows, macOS и большинство Unix-систем. Репозитории Mercurial управляются при помощи утилиты командной строки hg
, но есть и GUI-интерфейсы.
Наряду с традиционными возможностями систем контроля версий, Mercurial поддерживает полностью децентрализованную работу (отсутствует понятие основного хранилища кода), ветвление (возможно вести несколько веток одного проекта и копировать изменения между ветками), слияние репозиториев (чем и достигается «распределённость» работы). Поддерживается обмен данными между репозиториями через HTTP/HTTPS, SSH и вручную при помощи упакованных наборов изменений.
Утилита hg
обладает компактным интерфейсом, и Mercurial считается более простой в освоении системой, чем, например, git[10].
Концепции
[править | править код]Рабочий процесс
[править | править код]Mercurial является распределённой (децентрализованной) системой контроля версий. Это означает, что рабочий процесс, как правило, выглядит следующим образом:
- На личном компьютере создаётся новый репозиторий (путём клонирования существующего репозитория, создания нового и т. п.);
- В рабочем каталоге данного репозитория изменяются/добавляются/удаляются файлы;
- Выполняется фиксация (commit) изменений в данный репозиторий (то есть в локальный репозиторий на личном компьютере);
- Шаги 2 и 3 повторяются столько раз, сколько необходимо;
- Забираются (pull) чужие наборы изменений;
- Производится слияние изменений (merge);
- Отдаются (push) собственные.
То есть вся повседневная работа происходит в локальном репозитории, а когда возникает необходимость, производится отправка результатов своей работы в один или несколько других репозиториев. Количество шагов при работе с отдалёнными репозиториями можно сократить, если настроить Mercurial на автоматическую отправку изменений в другие репозитории при выполнении фиксации[11].
Консольная программа
[править | править код]Консольная программа реализована таким образом, что название любой команды можно сокращать до тех пор, пока её имя остаётся однозначным. Плюс некоторые команды имеют псевдонимы. Например, вместо hg commit
можно написать hg commi
, hg comm
или hg com
, но если написать hg c
, то Mercurial откажется выполнять эту команду, сообщив, что «команда 'c' неоднозначна» и приведя список команд, которые попадают под это сокращение. Использовать hg co
в качестве сокращения для hg commit
нельзя, так как это псевдоним для команды hg update,
однако доступно сокращение hg ci
.
Логическая структура наборов изменений
[править | править код]![](http://upload.wikimedia.org/wikipedia/ru/thumb/c/ce/%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B3%D1%80%D0%B0%D1%84%D0%B0_%D1%80%D0%B5%D0%B2%D0%B8%D0%B7%D0%B8%D0%B9_%D0%BD%D0%B0_%D1%81%D0%B0%D0%B9%D1%82%D0%B5_bitbucket.png/320px-%D0%9F%D1%80%D0%B5%D0%B4%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B3%D1%80%D0%B0%D1%84%D0%B0_%D1%80%D0%B5%D0%B2%D0%B8%D0%B7%D0%B8%D0%B9_%D0%BD%D0%B0_%D1%81%D0%B0%D0%B9%D1%82%D0%B5_bitbucket.png)
При вызове команды hg commit
выполняется фиксация изменений. При этом программа сохраняет в репозиторий набор изменений (англ. changeset или ревизия). Физически происходят те же изменения, что и у вас, но сохраняются они в служебные файлы, а не в копии (подробнее в За кулисами).
Как правило, все наборы изменений, которые были зафиксированы, отображают в виде большой связной сети (графа), где каждый набор изменений связан с одним или двумя другими.
Узнать идентификаторы родительских наборов изменений, с которыми связаны зафиксированные наборы изменений, можно с помощью команды hg log --debug
. У каждого набора изменений будет два родителя (благодаря чему возможно ветвление внутри репозитория, см. hg -v help branch
). Значение «-1:0000000000000000000000000000000000000000» означает отсутствие родителя. Например, у самого первого набора изменений в репозитории данное значение будет проставлено для обоих родителей, а у последующих данное значение будет проставлено для второго родителя (если для них в репозитории не использовалось ветвление), а для первого родителя будет проставлен идентификатор от предыдущего набора изменений.
Рабочий каталог также полезно представлять в виде такого же набора изменений (который пока не зафиксирован, но, возможно, вскоре также будет зафиксирован). Рабочий каталог также связан с одним или двумя родительскими наборами изменений, узнать о которых можно с помощью команды hg parents
. После фиксации изменений данные родители станут родителями для нового (уже зафиксированного) набора изменений.
Идентификация наборов изменений
[править | править код]Ревизии распознают по следующим признакам[12]:
- номеру ревизии;
- идентификатору набора изменений;
- меткам (тег);
- имени ветки.
Номер ревизии
[править | править код]Номер ревизии представляет собой целое число, отражающее порядок, в котором наборы изменений были добавлены в хранилище. Номер ревизии начинается с нуля, присваивается набору изменений автоматически и может использоваться для идентификации наборов изменений. Номер ревизии для одного и того же набора изменений может различаться в каждом из клонов хранилища. В выводе команды hg log
номер ревизии можно увидеть перед двоеточием (например, «4:e1be1898f374»).
Идентификатор набора изменений
[править | править код]Идентификатор набора изменений представляет собой SHA-1-хеш в виде шестнадцатеричного числа. Идентификатор набора изменений присваивается каждому набору изменений автоматически, вычисляется на основе содержимого этого набора изменений, поэтому соответствует одному и тому же набору изменений во всех репозиториях. Вероятность коллизии, когда для двух разных наборов изменений будет сгенерирован один и тот же SHA-1-хеш, крайне мала.
Mercurial не требует ввода полной строки идентификатора при использовании его в командах, ему достаточно лишь той его начальной части, которая однозначно идентифицирует требуемый набор изменений (в противном случае, Mercurial сообщит о неоднозначности). В выводе команды hg log
идентификатор набора изменений можно увидеть после двоеточия (например, «4:e1be1898f374»). Без параметра --debug
команда hg log
выводит не полный, а сокращённый (из 12 символов) идентификатор набора изменений.
Метки
[править | править код]В дополнение к номеру ревизии и идентификатору набора изменений, Mercurial предоставляет возможность присваивать каждому набору изменений одно или более произвольных символических имён, называемых метками (или тегами). Присваиваются метки с помощью команды hg tag
, а посмотреть все добавленные метки можно с помощью команды hg tags
. Имя метки не может содержать некоторые символы (например ": "), о чём, в случае необходимости, Mercurial сообщит при выполнении команды hg tag
.
Везде, где в командах можно указать идентификатор набора изменений, можно подставить имя метки.
Название ветки
[править | править код]Каждая ветка имеет собственное название. Оно указывается при создании ветки и больше никогда не изменяется.
Неочевидные моменты
[править | править код]![]() | Этот раздел не завершён. |
![]() | В разделе не хватает ссылок на источники (см. рекомендации по поиску). |
- Если в качестве идентификатора ревизии какой-либо команде передано число, то Mercurial будет считать, что ему передан номер ревизии и будет выполнять проверку на неоднозначность с сокращённым идентификатором наборов изменений только в том случае, если отсутствует набор изменений с указанным номером ревизии. Например, если в репозитории существует один набор изменений с номером ревизии «6» и другой набор изменений с идентификатором «647362ac74d76124267215af1a3f94aa9707dfdf» (начинается с цифры «6»), то команда
hg log -r 6
выдаст информацию о первом наборе изменений, не сообщив о неоднозначности. Поэтому, если глобальный идентификатор начинается с цифры, полезно всегда сокращать его лишь до тех пор, пока в нём не встретится буква. Данное поведение наблюдалось в версии 2.2.1 под Mac OS X 10.7.4. - Если создать метку с именем, например, «5» в то время как в репозитории существует (или появится в будущем) набор изменений с номером ревизии «5», то Mercurial будет искать в первую очередь наборы изменений по номеру ревизии. Но если создать метку с именем, например, «e1be» в то время как в репозитории существует (или появится в будущем) набор изменений с идентификатором наборов изменений, начинающимся с «e1be», то Mercurial будет искать наборы изменений в первую очередь уже по меткам. Притом, в обоих случаях о неоднозначности сообщено не будет. По этой причине не рекомендуется создавать метки, состоящие только из цифр и/или букв «a, b, c, d, e, f». Данное поведение наблюдалось в версии 2.2.1 под Mac OS X 10.7.4.
- Как и в git, нельзя добавить в репозиторий пустую папку (для решения этой проблемы можно положить в папку любой файл, например, readme.txt). Такое поведение связано с тем, что Mercurial не отслеживает папки, а только файлы[13]. Поведение реализовано осознанно для упрощения системы и пока что изменений не планируется[13].
Отличительные особенности
[править | править код]В отличие от git, Mercurial предполагает более строгую модель работы, наиболее заметными аспектами которой являются[14][15]:
- «Честные ветки» — любая ветвь может быть отслежена с самого начала;
- Хранение изменений в виде revlog (в противовес blob у git);
- Возможно слияние лишь двух ветвей за один проход (git допускает множественное слияние);
- Невозможность отмены коммита — вместо этого следует послать исправляющий коммит, который наложится поверх неудачного;
- Более строгий контроль различий по умолчанию следует единому стандарту, исключающему конфликты различных версий и клиентов.
Дополнительные средства
[править | править код]В комплекте с Mercurial поставляются CGI-сценарии для предоставления веб-интерфейса к репозиториям[16].
Есть графическая оболочка TortoiseHg[17], работающая как под Windows (с интеграцией в Explorer), так и под Linux (в виде отдельного приложения[18] или с интеграцией в Gnome/Nautilus[19]).
Atlassian также продвигает свой клиент SourceTree, предоставляющий доступ как к hg, так и к svn и git.
Ряд сред разработки имеет возможности для работы с Mercurial, например Microsoft Visual Studio[20][21], IntelliJ IDEA[22][23][24], Eclipse[25], Qt Creator (начиная с версии 2.0)[26], PIDA[27], NetBeans[28]. Возможна работа с Mercurial из Emacs c помощью входящего в Emacs универсального пакета VC.
Экспериментальная поддержка Mercurial есть в системе Trac[29]. Проект Redmine[30] также поддерживает репозитории Mercurial.
При помощи утилиты Tailor[31] или расширения convert[32] поддерживается конвертирование[33] репозиториев других систем контроля версий, включая CVS, Subversion, Git, Perforce, Darcs, GNU Arch, Bazaar.
Проекты, использующие Mercurial
[править | править код]Значительное количество проектов по разработке свободного программного обеспечения использует Mercurial в качестве основной системы контроля версий[34]. В их числе:
Поддерживаются Mercurial-зеркала основных репозиториев других проектов[36], например, GCC, Vim, Emacs и ядро Linux.
Среди проектов, длительное время использовавших Mercurial, но перешедших в 2019—2021 годы на Git — Adium, CLISP, Illumos, Coin3D, OpenJDK, SDL[37].
Примечания
[править | править код]- ↑ https://lkml.org/lkml/2005/4/20/45
- ↑ relnotes: add 6.8 — 2024.
- ↑ Release Notes
- ↑ Mercurial tag 6.8.1
- ↑ changeset 50269:05de4896508e stable 6.4rc0
- ↑ Release Notes
- ↑ Mercurial Relicensing
- ↑ Релиз распределённой системы управления версиями Mercurial 2.3 . Дата обращения: 11 марта 2013. Архивировано 12 ноября 2012 года.
- ↑ PerformancePlan - Mercurial . www.mercurial-scm.org. Дата обращения: 15 марта 2021.
- ↑ Сравнение Git и Mercurial в FAQ сайта Google Code Архивная копия от 20 декабря 2009 на Wayback Machine (англ.)
- ↑ mercurial automatic push on every commit Архивная копия от 4 августа 2014 на Wayback Machine (англ.)
- ↑ Идентификация наборов изменений . Дата обращения: 12 марта 2013. Архивировано 16 марта 2013 года.
- ↑ 1 2 FAQ — Mercurial Архивировано 26 июня 2009 года.
- ↑ "Сходство и различие между Mercurial и Git". Архивировано 2 августа 2018. Дата обращения: 5 июня 2018.
- ↑ "Ещё раз о «Mercurial против Git» (с картинками)". Архивировано 2 августа 2018. Дата обращения: 5 июня 2018.
- ↑ (недоступная ссылка с 04-06-13 [4101 день] — Настройка сервера для работы с Mercurial история) (рус.)
- ↑ TortoiseHg — Mercurial . Дата обращения: 14 ноября 2008. Архивировано 3 ноября 2008 года.
- ↑ SourceForge.net: TortoiseHg — Develop (недоступная ссылка)
- ↑ SourceForge.net: TortoiseHg — Develop (недоступная ссылка)
- ↑ VisualHG — плагин-провайдер для Microsoft Visual Studio 2008/2010 . Дата обращения: 8 февраля 2009. Архивировано из оригинала 5 февраля 2009 года.
- ↑ HgSccPackage — Mercurial-плагин для Microsoft Visual Studio 2008/2010 . Дата обращения: 10 июня 2010. Архивировано из оригинала 3 июля 2020 года.
- ↑ Mercurial Integration for IDEA Архивировано 14 мая 2008 года.
- ↑ hg4idea
- ↑ JetBrains IntelliJ IDEA Plugin Repository (недоступная ссылка)
- ↑ Mercurial Eclipse . Дата обращения: 21 июля 2007. Архивировано из оригинала 21 июня 2007 года.
- ↑ Qt Creator: Using version control systems Архивировано 24 сентября 2011 года.
- ↑ Появление поддержки Mercurial в PIDA . Дата обращения: 21 июля 2007. Архивировано 4 сентября 2007 года.
- ↑ Mercurial-плагин для NetBeans . Дата обращения: 21 июля 2007. Архивировано 15 июля 2007 года.
- ↑ Mercurial Plugin for Trac . Дата обращения: 21 июля 2007. Архивировано 3 июля 2007 года.
- ↑ Repositories in Redmine . Дата обращения: 23 июля 2010. Архивировано 29 мая 2010 года.
- ↑ Tailor Архивировано 10 июля 2007 года.
- ↑ ConvertExtension Архивная копия от 25 октября 2008 на Wayback Machine в Mercurial Wiki
- ↑ RepositoryConversion Архивная копия от 18 июля 2007 на Wayback Machine в Mercurial Wiki
- ↑ Some projects that use Mercurial Архивная копия от 7 сентября 2008 на Wayback Machine (англ.)
- ↑ Reed, J Paul Version Control System Shootout Redux Redux (12 апреля 2007). Дата обращения: 17 февраля 2019. Архивировано 17 ноября 2012 года.
- ↑ Projects with synchronized Mercurial repositories (англ.)
- ↑ SDL moving to GitHub . discourse.libsdl.org. Дата обращения: 11 февраля 2021. Архивировано 10 февраля 2021 года.
Ссылки
[править | править код]- Домашняя страница Mercurial (англ.)
- Документация по Mercurial (рус.)
- Книга «Mercurial: Полное руководство» (рус.) (другие форматы)
- Сборник статей о Mercurial (рус.)
Литература
[править | править код]- Bryan O'Sullivan. Mercurial: The Definitive Guide. — O'Reilly Media, Inc., 2009. — 288 с. — ISBN 9780596800673.
- Программное обеспечение по алфавиту
- Программное обеспечение, разработанное в 2005 году
- Программное обеспечение с лицензией GNU GPL
- Распределённые системы управления версиями
- Свободное программное обеспечение, написанное на Си
- Свободное программное обеспечение, написанное на Python
- Свободные системы управления версиями
- Свободное кроссплатформенное программное обеспечение