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

237

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

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

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

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

Примечания :

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

Вопросы:

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

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

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

Другой

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

Laz
источник

Ответы:

16

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

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.

Йоаким Лундборг
источник
7
Было бы полезно упомянуть, что если вы вручную hg addигнорируете файлы, Mercurial будет отслеживать их. Например, если у вас есть куча файлов , такие как deploy-test.conf, deploy-production.confи т.д. , и не хотят версии их (они могут иметь пароли в них) , но вы делаете хотите версию deploy-template.confвы можете просто игнорировать deploy*и вручную добавить deploy-templace.conf.
Стив Лош
7

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

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

$ hg status

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

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

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

$ hg diff
Стив Лош
источник
6

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

$ hg init my-repository

источник
5

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

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


Расширение конвертирования клонирует существующий репозиторий 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-СВН мост. Он допускает полное циклическое переключение ревизий (полное клонирование, извлечение и отправка), однако на момент написания этой статьи [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 утилита ( BitBucket дерево ). До недавнего времени это позволяло вам только клонировать и извлекать хранилище 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
кварк
источник
2
Я только что использовал, hg convertи это действительно занимает много времени, когда у вас есть хранилище SVN с большим количеством коммитов. Настройка локального репозитория с помощью svnsyncпомогает значительно ускорить процесс, особенно когда вам нужно сделать это несколько раз, потому что в вашей команде convert были неверные параметры.
Debilski
Я думаю, что все эти методы быстрее, если у вас есть локальная копия репозитория SVN. Но вы не всегда можете получить полный репозиторий, верно? Я думал, что svnsyncнеобходимо получить доступ к фактическим файлам хранилища, а не только к URL.
кварк
Обратите внимание, что hgsvn сейчас находится в режиме обслуживания , поэтому он больше не разрабатывается. Вместо этого они рекомендуют использовать hgsubversion.
Джон Л.
5

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

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

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

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

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

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

$ hg diff {file.code}

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

: D

NawaMan
источник
4

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

$ hg tag my-tag

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

$ hg clone working-repository my-tag-repository

источник
3
Почему нет hg tag my-tag?
Стив Лош
4

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

$ hg branch my-branch

или

$ hg клон оригинального репозитория my-branch

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

Ник Ходжес
источник
4
Это тяжелый способ, которым мерзавцы всегда смеются над людьми Mercurial за рекомендации. Более легкий, более знакомый способ для начинающих будетhg branch my-branch
Стив Лош
8
Вы должны отметить, что это две совершенно разные операции.
степанчег
2
Я нашел это руководство, которое может быть полезно для ветвления в Mercurial: stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
mbillard
Для легких ветвей в hg, которые не являются постоянными (как ветка hg), используйте расширение
ртутных
Статья, на которую ссылается GoodEnough, предоставляет еще один легкий метод с использованием закладок. Кажется, довольно хорошо для изменений, которые не имеют существенного значения, чтобы заслужить свою собственную ветку
Casebash
4

Хороший плагин 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.

Плагины

Macke
источник
3

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

Вызвать эту команду из текущего локального * 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.
  • Если сообщение о фиксации не указано, запускается настроенный редактор, который запрашивает у вас сообщение.
оборота
источник
3

Как настроить 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: Полное руководство ».

las3rjock
источник
3

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

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary
Мартин Гайслер
источник
Как новый пользователь Mercurial, и как кто-то новичок в управлении версиями в целом, я не очень понимаю этот ответ. Не могли бы вы уточнить и расширить свой пост? Я до сих пор не совсем понимаю, как использовать команду слияния.
Джамин Грей
3

Как установить 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 из исходного кода.

Dave Everitt
источник
1
Чтобы собрать Mercurial из исходного кода, понадобятся заголовки Python. Установите python-dev или python-devel для тех, кто использует пакетно-ориентированные дистрибутивы.
Николя Думазет
3

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

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

hg pull

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

hg update

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

hg pull -u

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

Laz
источник
1
Начало координат записывается .hg/hgrcпри выполнении клонирования, поэтому вам не нужно указывать его при нажатии / нажатии. Вы можете добавить больше путей к [paths]разделу, .hg/hgrcесли хотите.
Мартин Гейслер
3

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

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

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

jpartogi
источник
1

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

$ hg commit -m "Commit message"
NawaMan
источник
1

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

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

$ hg outgoing

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

$ hg outgoing -p
robotadam
источник
1

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

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

$ hg remove {file(s)}

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

$ hg remove -Af {file(s)}

или из Mercurial 1.3

$ hg forget {file(s)}
Дэвид Сайкс
источник
1

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

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

$ hg update [-r REV]

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

Дэвид Сайкс
источник
1

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

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

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, которое не удалось применить, вам нужно посмотреть.

мин
источник
1
Разве это не для чего hg backout?
Вим Коенен
Да, однако hg backout поддерживает только один идентификатор набора изменений для возврата. Обязательно стоит упомянуть,
обновлю
1

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

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

[extensions]
transplant=

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

$ hg transplant -b foo 81
Джон Ми
источник
Более новые версии Mercurial не нуждаются в расширении пересадки. Вы можете использовать встроенную graftкоманду, чтобы сделать то же самое. hg help graftдля получения дополнительной информации
DOOManiac
1

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

$ hg export -o patchfile changeset

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

$ hg import patchfile
David Sykes
источник