Mercurial для начинающих: полное практическое руководство

Вдохновленный Git для начинающих: полное практическое руководство.

Это сборник информации по использованию Mercurial для начинающих для практического использования.

Новичок - программист, который коснулся управления исходным кодом, не очень хорошо понимая его.

Практически - охватывать ситуации, с которыми часто сталкивается большинство пользователей, - создание репозитория, ветвление, слияние, извлечение / перенос из / в удаленный репозиторий и т. Д.

Примечания:

  • Объясните, как сделать что-то, а не как это реализовать.
  • Разберитесь с одним вопросом на ответ.
  • Ответьте четко и максимально кратко.
  • Редактируйте / расширяйте существующий ответ, а не создавайте новый ответ на ту же тему.
  • Пожалуйста, предоставьте ссылку на Mercurial wiki или HG Book для людей, которые хотят узнать больше.

Вопросы:

Установка / настройка

Работа с кодом

Пометка, ветвление, релизы, базовые показатели

Другой

Другие ссылки Mercurial

22 ответа

Как вы настраиваете его, чтобы игнорировать файлы?

Ignore настраивается в обычном текстовом файле с именем.hgignore в корне вашего хранилища. Добавьте его как обычный файл с:

hg add .hgignore

Существует два варианта синтаксиса для сопоставления файлов: glob и regexp. glob - это расширение имени файла в стиле Unix, а регулярное выражение - регулярные выражения. Вы активируете каждый, добавляя syntax: glob или же syntax: regexp на линии сам по себе. Все последующие строки будут использовать этот синтаксис до следующего маркера синтаксиса. Вы можете иметь столько синтаксических маркеров, сколько захотите. Синтаксис по умолчанию - regexp, поэтому, если вы используете только regexp, вам не нужен маркер синтаксиса.

Вы можете добавить комментарии с #

Пример:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

Игнорировать относится только к неуправляемым файлам (т. Е. Файлам, которые еще не зарегистрированы). Чтобы игнорировать файлы, которые находятся под контролем версий, вы можете использовать ключи -I и -X.

Как вы видите, что не передано, или статус вашей текущей кодовой базы?

Чтобы увидеть список файлов, которые были изменены:

$ hg status

Это напечатает каждый файл, который был изменен вместе с его статусом, который может включать:

  • M - Изменено. Файл был изменен, и изменения не были зафиксированы.
  • A - Добавлено. Файл не отслеживался ранее, но, если вы совершите коммит, Mercurial начнет отслеживать его.
  • R - удалено. Файл отслеживался ранее, но если вы совершите коммит, Mercurial перестанет отслеживать его в этом и последующих коммитах.
  • ? - неизвестно. Файл в настоящее время не отслеживается Mercurial. Фиксация не повлияет на это, если вы не используете hg add добавить это.
  • ! - Отсутствует. Файл отслежен, но Mercurial не может найти его в рабочей копии.

Чтобы увидеть изменения, которые фактически были внесены в файлы:

$ hg diff

Как вы создаете новый проект / репозиторий?

$ hg init my-repository

Как я могу взаимодействовать с Subversion?

Есть три способа:


Расширение convert будет клонировать существующий репозиторий Subversion в Mercurial. Поставляется с Mercurial. Это работает примерно так:

hg convert <Subversion URL or directory> <path to new Mercurial repository>

Например, это будет захватывать ствол хранилища memcached SixApart.

hg convert http://code.sixapart.com/svn/memcached/trunk

Расширение может постепенно вносить новые ревизии из хранилища Subversion в Mercurial (немного похоже на pull). Однако он не поддерживает принятие ревизий Mercurial и отправку их обратно в Subversion (без push). [XXX: исправить это, если это не так].


Расширение hgsubversion. Во многих отношениях это наиболее сложное решение, поскольку для взаимодействия с хранилищем Subversion используется API Subversion. Он стремится стать мостом HG-SVN. Он допускает полное циклическое переключение ревизий (полное клонирование, извлечение и отправка), однако на момент написания этой статьи [XXX: исправьте это, если / когда оно станет неправильным], оно все еще находится в разработке и еще не выпущено официальных релизов. Как следствие, он работает только с самой современной версией Mercurial (1.3 на момент написания статьи).

  • Он отображает теги и ветви (все теги предшествуют tags/ выделить их из одноименных ветвей).
  • Поддерживает специальную ветку closed-branches для закрытия веток, которые удалены в Subversion.
  • Это требует, чтобы хранилище Subversion было размещено в соответствии с соглашением о стволе / ветвях / тегах.
  • Набор команд обычно hg svn <subcommand> хотя он нацелен на интеграцию до такой степени, что вам не нужна часть 'svn' (то есть он хочет обработать клон Subversion настолько, насколько это возможно, как любое другое хранилище Mercurial).;

Это работает так:

клон:

hg svnclone <Subversion URL> 

ИЛИ (только для svn:// URL-адрес)

hg clone <svn:// URL>

вытащить:

hg svn pull

От себя:

hg svn push

входящие:

hg svn incoming

исходящие:

hg svn outgoing

Проверка всего хранилища:

hg svnclone http://code.sixapart.com/svn/memcached

Утилита hgsvn ( дерево битбакетов). До недавнего времени это только позволяло вам клонировать и извлекать хранилище Subversion, но с hgsvn 0.1.7 это поддерживает толчок. [Я не знаю, насколько хорошо это толкает. Любой, у кого есть больше опыта, должен обновить это.] У этого есть следующие известные особенности:

  • Он генерирует тег Mercurial для каждого тега SVN.
  • Он помещает локальный тег в каждый набор изменений, чтобы отметить его ревизию SVN.
  • Он помещает каждую ревизию Mercurial в именованную ветку, названную в честь ее ветки SVN. Например branches/some-feature было бы как hg branch some-feature, Это ставит багажник на trunk (т.е. в ветке Mercurial по умолчанию ничего нет, если пользователь явно не переключается на нее.)
  • Он будет пытаться идентифицировать ветви и теги и создавать их, но если это невозможно, он просто пропускает их. Это удобно, когда хранилище Subversion не следует стандартному расположению ствола / веток / тегов.

Это работает так:

клон:

hgimportsvn <Subversion URL>

вытащить:

hgpullsvn

От себя:

hgpushsvn

входящие:

hgpullsvn -n

исходящие:

hgpushsvn -n

Проверка всего хранилища:

hgimportsvn http://code.sixapart.com/svn/memcached

Проверяю только багажник:

hgimportsvn http://code.sixapart.com/svn/memcached/trunk

Как вы сравниваете две ревизии файла или ваш текущий файл и предыдущую ревизию?

Оба используют hg diff, когда hg diff Используются все изменения в рабочей копии и отображается подсказка (последний коммит).

Для "Как вы сравниваете две ревизии файла?"

$ hg diff -r{rev1} -r{rev2} {file.code}

Приведенная выше команда будет отличаться между rev1 и rev2 файла "file.code".

Для "Как вы сравниваете ваш текущий файл и предыдущую версию?"

$ hg diff {file.code}

Приведенная выше команда будет отличаться между текущей версией "file.code" и самой последней ревизией (последней принятой).

: D

Хороший плагин GUI/IDE для Mercurial?

графический интерфейс пользователя

  • TortoiseHg практически для любой ОС. Включает интеграцию с Windows Explorer. Он также работает в Linux и некоторых других ОС, в том числе Max OS X. Он имеет несколько неуклюжий интерфейс и поначалу немного неудобен в использовании, но он очень полный и мощный.
  • Murky работает на Mac OS X 10.5 или более поздней версии. Murky хорош для изучения репозитория и основных команд, но вам также нужно знать, как использовать командную строку.
  • MacHg - хороший Mac OS X Gui, который имеет немного больше функциональности и полировки, чем Murky, но вам все равно понадобится и командная строка.
  • SourceTree изначально является клиентом Mac, а версия для Windows доступна совсем недавно. Довольно приятный пользовательский интерфейс (по крайней мере, на OS X), поддерживает большинство функций Hg, включая shelve.

Плагины

Как вы ветвитесь?

$ hg branch my-branch

или же

$ hg clone оригинальный репозиторий my-branch

Хотя следует отметить, что ветвь создает "виртуальный" каталог (т. Е. Файлы остаются теми же, но hg обрабатывает их, как если бы они были разными внутри системы), в то время как клон создает фактическую, полную копию. Строго говоря, клон не разветвляется.

Как вы "помечаете" "тег" или "выпускаете" определенный набор ревизий для определенного набора файлов, чтобы вы всегда могли получить его позже?

$ hg tag my-tag

Вы также можете клонировать свой репозиторий, чтобы создать специальный репозиторий тегов.

$ hg clone working-repository my-tag-repository

Как вы сливаете ветки?

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary

Как вы получаете последний код?

Mercurial запоминает, откуда был клонирован репозиторий (в.hg/hgrc), поэтому вы можете просто запустить:

hg pull

вытащить последний код из origin-репозитория. (Это не обновляет рабочий каталог)

hg update

обновить рабочий каталог.

hg pull -u

одновременно выполнять извлечение и обновление.

Как вы проверяете код?

hg clone [OPTION]... SOURCE [DEST]

Где вариант может быть:

 -U --noupdate      the clone will only contain a repository (no working copy)
 -r --rev           a changeset you would like to have after cloning
    --pull          use pull protocol to copy metadata
    --uncompressed  use uncompressed transfer (fast over LAN)
 -e --ssh           specify ssh command to use
    --remotecmd     specify hg command to run on the remote side

Где источник - это источник исходных файлов, расположенных в хранилище, где это может быть удаленный URL или каталог файловой системы. Например:

И место назначения - это место, где исходный код будет находиться в вашей локальной файловой системе.

Как вы делаете изменения?

Вызвать эту команду из текущего локального * mercurial репозитория

hg commit [OPTION]... [FILE]...

псевдонимы: ci

  • Локальный ртутный репозиторий имеет.hg внутри текущего каталога

Где вариант может быть:

 -A --addremove     mark new/missing files as added/removed before committing
    --close-branch  mark a branch as closed, hiding it from the branch list
 -I --include       include names matching the given patterns
 -X --exclude       exclude names matching the given patterns
 -m --message       use <text> as commit message
 -l --logfile       read commit message from <file>
 -d --date          record datecode as commit date
 -u --user          record user as committer

Пример команды будет:

hg commit -m "added readme" README

ЗАМЕЧАНИЯ:

  • Если список файлов опущен, будут зафиксированы все изменения, о которых сообщает "hg status".
  • Если вы фиксируете результат слияния, не предоставляйте имена файлов или фильтры -I/-X.
  • Если сообщение о фиксации не указано, запускается настроенный редактор, который запрашивает у вас сообщение.

Как установить Mercurial?

Пожалуйста, отредактируйте, если вы установили из исходного кода в Linux или использовали установщики Windows.

Mac OS X 10,4 (тигр), 10,5 (леопард)

Используйте Python easy_install (с Setuptools):

sudo easy_install mercurial

Это находит последнюю версию (1.3.1 на момент написания) и устанавливает в:

/Library/Frameworks/Python.framework/Versions/2.6/bin/

В Python 2.6 также используется пакет установки Mercurial OS X (1.2.1 по состоянию на 26 июля 2009 г.), который жалуется на необходимость Python 2.5. Из документации видно, что Fink и Macports устанавливают версию 1.2.

Linux

Большинство явных пакетов Linux, похоже, отстают от текущей версии, поэтому используйте easy_install (как указано выше) или загрузите архив с Mercurial, извлеките архив, перейдите в каталог mercurial и выполните:

$ make
$ sudo make install    # do a system-wide install
$ hg debuginstall      # sanity check
$ hg                   # see help

(из Представления Mercurial, распределенной системы контроля версий)

Windows

Существует бинарный пакет последней версии Mercurial. TortoiseHg является расширением оболочки Windows для Mercurial и устанавливает его. Cygwin также может установить Mercurial.

В качестве альтернативы (инструкции слишком длинны, так что связаны здесь), вы можете создать оптимизированную или чистую версию Mercurial на Python из исходного кода.

Как настроить Mercurial?

Mercurial сохраняет информацию о своей конфигурации в ~/.hgrc в системах *nix и в %UserProfile%\mercurial.ini в системах Windows. (%UserProfile% обычно "C:\Documents and Settings\[username]\" в системах Windows 2000 или Windows XP и, как правило, C:\Users\[username]\ в системах Windows Vista и Windows 7.)

В качестве отправной точки вы должны установить свое имя пользователя Mercurial, указав в .hgrc или же mercurial.ini:

# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname <email.address@example.net>

Пользователи TortoiseHg в системах Windows могут альтернативно запускать hgtk userconfig

См. Также " Создание файла конфигурации Mercurial" в главе 2 " Mercurial: Полное руководство".

Как вы видите, какие изменения будут отправлены в верхний репозиторий при нажатии?

использование hg outgoing чтобы получить список наборов изменений, которые будут установлены в репозиторий по умолчанию:

$ hg outgoing

Чтобы получить реальные изменения кода, используйте -p (--patch). Это выведет каждую ревизию полностью:

$ hg outgoing -p

Как вы делаете изменения?

$ hg commit -m "Commit message"

Как вы возвращаете набор изменений?

Доступны несколько вариантов

Easy Way (возврат одного набора изменений)

$ hg backout -m 'back out second change' tip
reverting myfile
changeset 2:01adc4672142 backs out changeset 1:7e341ee3be7a
$ cat myfile
first change

Жесткий путь (вручную различий и применения)

Шаг 1: Создайте файл патча, чтобы восстановить то, что изменилось между ревизиями 107 и 108:

hg diff -r107 -r108 --reverse  > revert-change.patch

(поочередно, hg diff -r108 -r107 без --reverse будет делать то же самое)

Шаг 2: примените файл патча:

patch -p1 < revert-change.patch

Некоторые различия могут не применяться, например:

Hunk #3 FAILED at 517.
1 out of 3 hunks FAILED -- saving rejects to file 'foo/bar.c.rej'

Файл.rej будет содержать содержимое diff, которое не удалось применить, вам нужно посмотреть.

Как извлечь патч из определенного набора изменений?

$ hg export -o patchfile changeset

Затем вы можете импортировать это в другую ветку с помощью:

$ hg import patchfile

Как вы вернетесь к предыдущей версии кода?

Из этого вопроса

$ hg update [-r REV]

@van: Если позже вы совершите коммит, вы фактически создадите новую ветку. Тогда вы можете продолжить работу только над этой веткой или в итоге объединить существующую в нее.

Как объединить части одной ветви в другую?

Включите расширение "трансплантат" в вашем.hg/hgrc

[extensions]
transplant=

Загрузите целевую ветвь, а затем пересадите целевую ревизию.
Например: вишня выбрать редакцию 81 из ветви 'Foo' в текущую ветку

$ hg transplant -b foo 81

Как вы видите историю изменений в файле или хранилище?

Чтобы показать историю ревизий всего хранилища или файлов

$ hg log {file(s)}

или же

$ hg history {file(s)}

И увидеть список в обратном порядке

$ hg log -r:

Как вы удаляете файл из хранилища?

Чтобы удалить файл из хранилища и удалить его при следующей фиксации:

$ hg remove {file(s)}

Чтобы удалить файл из хранилища, но не удалить его

$ hg remove -Af {file(s)}

или из Mercurial 1.3

$ hg forget {file(s)}
Другие вопросы по тегам