Команды по работе с Mercurial

Базовые команды по работе с Mercurial

Разработчикам, имеющим опыт работы с Subversion, принципы взаимодействия с Mercurial покажутся во многом знакомыми. Также как и в Subversion, в Mercurial для выполнения всех действий с репозиторием используется одна программа — hg. Для выполнения каждого действия с репозиторием этой программе передается определенная команда, при необходимости дополненная соответствующими параметрами. Ниже приведены некоторые основные команды для работы с репозиториями.

Создание репозитория

hg init 

Выполнение этой команды в текущем (пустом) каталоге создаст в нем пустой Mercurial репозиторий. Также может быть выполнена как hg init имя_каталога, при этом создаст необходимый каталог и инициализирует пустой репозиторий в нем.

Клонирование репозитория

hg clone исходный_репозиторий репозиторий-клон 

Создает копию репозитория в указанном каталоге. Может использоваться как для создания локальной копии удаленного репозитория, так и для создания копии локального репозитория для реализации какой-либо новой возможности (в некоторых случаях наличие отдельного репозитория может быть предпочтительней отдельной ветки в рамках одного репозитория).

Получение набора изменений в локальный репозиторий

hg pull репозиторий-источник 

Pull — дословно «утянуть», «стянуть». Выполненная в каталоге с локальным репозиторием, эта команда скопирует с репозитория-источника все недостающие в локальном репозитории изменения. Если репозиторий был клонирован с другого, то команду можно сократить до hg pull, при этом в качестве источника будет взят тот же репозиторий, что и при предыдущем получении изменений. Важно понимать, что выполнение этой команды только обновляет историю изменений в репозитории, рабочая копия при этом остается нетронутой. Для ее актуализации служит следующая команда.

Актуализация рабочей копии кода

hg update 

Выполняет актуализацию рабочей копии кода до последней версии. Обычно выполняется после получения набора изменений с другого репозитория (hg pull). Также может быть использована для получения рабочей копии по состоянию на какую-либо указанную ревизию.

Запись сделанных правок в репозиторий

hg commit 

Вносит модификации, сделанные в рабочей копии, в репозиторий, создавая отдельную ревизию (версию). По умолчанию в репозиторий будут внесены изменения для всех файлов, находящихся под управлением mercurial; изменения только для некоторых файлов можно занести в репозиторий, указав их имена: hg commit файл1 файл2 …

Передача набора изменений из локального репозитория

hg push репозиторий-получатель 

Обратная к hg pull команда. Выполняет передачу в репозиторий-получатель недостающих по сравнению с локальным репозиторием наборов изменений.

Добавление файлов в репозиторий, удаление файлов, переименование

Добавить файлы в репозиторий (фактически будут добавлены в репозиторий при выполнении последующей команды hg commit):

hg add файл1 файл2 файл3... 

Удалить файлы из репозитория (история изменений для указанных файлов в репозитории сохраняется, файлы также удаляются из текущей рабочей копии):

hg remove файл1 файл2 файл3... 

Переименование/перемещение файлов, находящихся под управлением mercurial, выполняется следующими командами:

hg rename старое_имя новое_имя 

аналог:

hg mv старое_имя новое_имя 

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

Просмотр состояния текущей рабочей копии

hg status 

Покажет состояние текущей рабочей копии. Полезно для просмотра того, какие файлы изменились со времени последней актуализации рабочей копии, какие добавились и т.п. Выводит список файлов с односимвольным индикатором состояния файла. Наиболее часто встречающиеся:

  • M — файл изменен (файл в рабочей копии отличается от файла в репозитории)
  • A — файл добавлен (при выполнении команды hg commit будет фактически внесен в репозиторий)
  • R — файл удален (при следующем выполнении hg commit будет помечен в репозитории как удаленный для последующих ревизий)
  • ! — файл находится под управлением mercurial, но не найден в рабочей копии (например, был ошибочно удален средствами операционнной системы)
  • ? — файл присутствует в рабочей копии, но не находится под управлением mercurial (для внесения такого файла в репозиторий надо выполнить hg add имя_файла)

Списки игнорируемых файлов

Зачастую в каталогах проекта могут появляться какие-то файлы, которые нежелательно отдавать на попечение системы контроля версий. Например, к таким файлам могут относиться различные временные файлы, создаваемые текстовым редактором или компилятором. Такие файлы можно просто не включать в репозиторий, но при каждом выполнении команды hg status будет выводиться их список с пометкой «?». Чтобы избежать такого поведения, существует специальный список файлов-исключений — файлов, которые должны игнорироваться mercurial, хотя и могут находиться в каталоге рабочей копии. Такой файл носит имя .hgignore и должен располагаться в корневом каталоге репозитория. Формат файла следующий:

# comments syntax: glob *.bak *.tmp syntax: regexp \.bak$ \.tmp$ 

Строки, начинающиеся со знака «#», являются комментариями. Строка, начинающаяся со слова «syntax:», означает указание на используемый далее в тексте тип описаний. Может принимать два различных значения: glob — в этом случае файлы для исключения описываются масками по аналогии с используемыми в операционных системах (символ ‘*’ означает любое количество любых символов, символ ‘?’ означет строго один любой символ); regexp — в этом случае для описаний используются регулярные выражения (формат которых аналогичен используемым в Perl).

Общепринятой практикой является создание файла .hgignore сразу же после создания репозитория и включение этого файла в самый первый набор изменений («коммит»).

Поддерживаемые протоколы

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

  • локальная/файловая/система или file://локальная/файловая/система — используется в случае, когда имеем дело с репозиторием на локальном компьютере.
  • http://пользователь@хост:порт/путь и https://пользователь@хост:порт/путь — используется для доступа к репозиториям, обслуживаемым mercurial, запущенным в режиме веб-сервера.
  • ssh://пользователь@хост:порт/путь — используется для доступа к репозиторию по протоколу ssh. На системе, с которой устанавливается ssh-сессия, также должен быть установлен mercurial.
  • static-http://пользователь@хост:порт/путь — используется для доступа к репозиториям, выложенным на веб-сервер в виде простого каталога. Не требует наличия дополнительного программного обеспечения или настройки. Доступ в таком случае возможен только на чтение.