Меркуріал для початківців: остаточний практичний посібник


237

Натхненний Git для початківців: остаточний практичний посібник .

Це збірка інформації про використання Mercurial для початківців для практичного використання.

Новачок - програміст, який торкнувся управління джерелом, не дуже добре його розуміючи.

Практична - охоплює ситуації, з якими часто стикається більшість користувачів - створення сховища, розгалуження, об'єднання, витягнення / виштовхування з / у віддалений сховище тощо.

Примітки :

  • Поясніть, як щось зробити, а не як щось реалізувати.
  • Займайтеся одним питанням на відповідь.
  • Відповідайте чітко і максимально стисло.
  • Відредагуйте / розгорніть існуючу відповідь, а не створюйте нову відповідь на ту саму тему.
  • Надайте посилання на вікі Mercurial або Книгу HG для людей, які хочуть дізнатися більше.

Запитання:

Установка / налаштування

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

Позначення, розгалуження, випуски, базові лінії

Інший

Інші посилання на Меркуріал

Відповіді:


16

Як налаштувати його на ігнорування файлів?

Ігнорування налаштовано у звичайному текстовому файлі під назвою .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>

Наприклад, це захопить ствол схованного сховища SixApart.

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

Розширення може поступово вносити нові версії із сховища Subversion у Mercurial (трохи схоже на потяг). Однак він не підтримує внесення змін до Меркурія і пересилання їх до Subversion (без натиску). [XXX: Виправте це, якщо це неправильно] .


Розширення hgsubversion . Це багато в чому найскладніше рішення, оскільки воно використовує API Subversion для зв'язку з сховищем 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допомагає значно прискорити роботу, особливо коли це потрібно зробити кілька разів, оскільки у вашій команді перетворення були неправильні параметри.
Дебільський

Я думаю, що всі ці методи швидше, якщо у вас є локальна копія сховища 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


4

Як ви "позначаєте" тег "чи" випускаєте "певний набір редакцій для певного набору файлів, щоб ви завжди могли перетягнути його пізніше?

$ hg tag my-tag

Ви також можете клонувати своє сховище, щоб створити спеціальне сховище тегів .

$ hg clone working-repository my-tag-repository

3
Чому ні hg tag my-tag?
Стів Лош

4

Як ви відділення?

$ hg гілка моєї гілки

або

$ hg клон оригінального репозиторію моєї гілки

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


4
Це важкий спосіб, з якого люди з гніту завжди насміхаються з Меркуріалу за рекомендації. Легший, звичніший для початківців спосібhg branch my-branch
Стів Лош

8
Ви повинні зазначити, що це дві абсолютно різні операції.
stepancheg

2
Я знайшов цей посібник, який може бути корисним для розгалуження в Mercurial: stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
mbillard

Для легких гілок в hg, які не є постійними (як гілка hg), використовуйте розширення mercurial bookmarks
hultqvist

Стаття, пов’язана GoodEnough, пропонує ще один легкий метод із використанням закладок. Здається, досить добре для змін, які не мають великого значення для того, щоб заслужити свою власну гілку
Casebash,

4

Гарний плагін GUI / IDE для Mercurial?

GUI

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

Плагіни


3

Як ви здійснюєте зміни?

Викликайте цю команду з поточного локального * сховища сховища *

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 фільтрів.
  • Якщо повідомлення про фіксацію не вказано, налаштований редактор починає запрошувати вас на повідомлення.

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: Постійний посібник ".


3

Як ви зливаєте гілки?

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

Як новий користувач, який користується обміном, і як хтось, хто взагалі має джерело контролю за редакцією джерела, я не дуже розумію цю відповідь. Чи можете ви уточнити та розширити свою посаду? Я все ще не зовсім розумію, як використовувати команду merge.
Джамін Грей

3

Як встановити Mercurial?

Будь ласка, відредагуйте, якщо ви встановили з джерела на Linux або використовували інсталятори Windows.

Mac OS X 10.4 (тигр), 10.5 (леопард)

Використовуйте easy_install Python's (з програмою 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, розподіленої системи управління версіями )

Windows

Існує двійковий пакет останньої версії Mercurial . TortoiseHg - це розширення оболонки Windows для Mercurial та встановлює його. Cygwin також може встановити Mercurial.

Як варіант (інструкції занадто тривалі, тому пов'язані тут), ви можете створити оптимізовану чи чисту версію Mercurial для Python з джерела.


1
Щоб побудувати вимір з джерела, потрібні будуть заголовки Python. Встановіть python-dev або python-devel для тих, хто використовує пакетно-орієнтовані дистрибутиви.
Nicolas Dumazet

3

Як отримати останній код?

Mercurial запам'ятовує, звідки було клоновано сховище (in .hg / hgrc), щоб ви могли просто запустити:

hg pull

витягнути останній код із початкового сховища. (Це не оновлює робочий каталог)

hg update

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

hg pull -u

виконати як витяг, так і оновлення відразу.


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

І місце призначення, де буде розташований вихідний код у вашій локальній файловій системі.



1

Як ви бачите, які зміни будуть надіслані у сховище вище за течією?

Використовуйте hg outgoingдля отримання списку наборів змін, які будуть встановлені у сховищі за замовчуванням:

$ hg outgoing

Щоб отримати фактичні зміни коду, використовуйте -p( --patch). Це виведе кожен набір змін повністю:

$ hg outgoing -p

1

Як видалити файл із сховища?

Щоб видалити файл із сховища та видалити його під час наступного комітету:

$ hg remove {file(s)}

Щоб видалити файл із сховища, але не видаляти його

$ hg remove -Af {file(s)}

або від Mercurial 1.3

$ hg forget {file(s)}

1

Як повернутися до попередньої версії коду?

З цього питання

$ hg update [-r REV]

@van: Якщо пізніше ви скористаєтесь, ви ефективно створите нову гілку. Тоді ви можете продовжувати працювати лише над цією гілкою або з часом об'єднати існуючу в неї.


1

Як відновити набір змін?

Пара варіантів

Легкий шлях (резервне копіювання одного змінного набору)

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

Hard Way (розрізняти та застосовувати вручну)

Крок 1. Створіть файл виправлення, щоб відновити зміни, змінені між версіями 107 та 108:

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

(поперемінно, hg diff -r108 -r107 без no --реверс буде робити те саме)

Крок 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.