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

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

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

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

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

Примечания:

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

Вопросы:

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

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

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

Другой

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

Ответы

Ответ 1

Как настроить его для игнорирования файлов?

Игнорировать настроен в обычном текстовом файле с именем .hgignore в корневом каталоге вашего репозитория. Добавьте его, как обычный файл, с помощью:

hg add .hgignore

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

Вы можете добавлять комментарии с помощью #

Пример:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

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

Ответ 2

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

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

$ hg status

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

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

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

$ hg diff

Ответ 3

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

$ hg init my-repository

Ответ 4

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

Существует три способа:


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

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

Например, это захватит сундук хранилища mema файлов SixApart.

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

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


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

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

Он работает следующим образом:

Клон:

hg svnclone <Subversion URL> 

ИЛИ (только для URL svn://)

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 утилита (bitbucket tree), До недавнего времени это позволяло вам клонировать и вытаскивать репозиторий Subversion, но с hgsvn 0.1.7 он поддерживает push. [Я не знаю, насколько это хорошо. Любой, у кого больше опыта, должен обновить это.] Он имеет следующие примечательные функции:

  • Он генерирует тег 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

Ответ 5

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

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

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

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

Вышеуказанная команда будет отличаться между rev1 и rev2 "file.code".

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

$ hg diff {file.code}

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

: D

Ответ 6

Как вы введете?

$hg branch my-branch

или

$hg clone original-repository my-branch

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

Ответ 7

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

$ hg tag my-tag

Вы также можете клонировать ваш репозиторий для создания специального хранилища тегов.

$ hg clone working-repository my-tag-repository

Ответ 8

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

GUI

  • 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, включая полку.

Плагины

Ответ 9

Как объединить ветки?

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

Ответ 10

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

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

Mac OS X 10.4 (Tiger), 10.5 (Leopard)

Использовать 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 tarball, извлеките архив, перейдите в каталог mercurial и запустите:

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

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

Окна

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

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

Ответ 11

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

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

hg pull

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

hg update

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

hg pull -u

для одновременного выполнения как pull, так и обновления.

Ответ 12

Как проверить код?

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 или файловой системой. Например:

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

Ответ 13

Как вы совершаете изменения?

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

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", будут зафиксированы.
  • Если вы выполняете результат слияния, не указывайте никаких имен файлов или -I/-X-фильтров.
  • Если сообщение commit не указано, запущенный настроенный редактор запрашивает сообщение.

Ответ 14

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

Mercurial хранит информацию о конфигурации в ~/.hgrc on * 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 protected]>

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

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

Ответ 15

Как вы совершаете изменения?

$ hg commit -m "Commit message"

Ответ 16

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

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

$ hg outgoing

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

$ hg outgoing -p

Ответ 17

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

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

$ hg log {file(s)}

или

$ hg history {file(s)}

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

$ hg log -r:

Ответ 18

Как удалить файл из репозитория?

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

$ hg remove {file(s)}

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

$ hg remove -Af {file(s)}

или от Mercurial 1.3

$ hg forget {file(s)}

Ответ 19

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

Пара доступных опций

Простой способ (резервное копирование одного набора изменений)

$ 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 без no -reverse сделает то же самое)

Шаг 2: Примените файл исправления:

patch -p1 < revert-change.patch

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

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

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

Ответ 20

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

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

$ hg update [-r REV]

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

Ответ 21

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

$ hg export -o patchfile changeset

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

$ hg import patchfile

Ответ 22

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

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

[extensions]
transplant=

Загрузите целевую ветвь, затем перетащите целевую ревизию.
например: ревизия 81 черешни из ветки 'foo' в текущую ветвь

$ hg transplant -b foo 81