Взаємодія Git із сховищем Mercurial


195

Я використовую GIT на Mac. Достатньо сказано. У мене є інструменти, я маю досвід. І я хочу продовжувати його використовувати. Тут немає війн ...

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

Тепер ... Деякі хлопці приходять разом з Меркуріалом. Штраф за них: у них є свої причини. Але я не можу знайти жодного GIT HG поза коробкою. Я не хочу переходити на HG, але мені все одно потрібно взаємодіяти з їх сховищем.

Хтось із вас, хлопці, знає просте рішення для цього?


4
hg-git працює в обох напрямках.
— Дерек Махар

1
Відповідь від @dubiousjim є більш корисною, всебічною та актуальнішою, ніж нинішні дві кращі, які вказують на невмілі репортажі або дають застарілі поради. Але все ж більше оновлень з цього питання буде дуже корисним.
— nealmcb

Відповіді:


60

Оновлення від червня 2012 року. Зараз, здається, існують такі методи сумісності Git / Hg, коли розробник хоче працювати з git сторони:

  1. Встановіть Mercurial та розширення hg-git . Останнє можна зробити за допомогою менеджера пакунків або за допомогою easy_install hg-git. Потім переконайтеся, що у вашому ~ / .hgrc:

    [extensions]
    hggit = 
    

    Можливо, ви побачите кілька посилань, які говорять про вказівку bookmarksрозширення і тут, але це вбудовано в Mercurial з версії 1.8. Ось кілька порад щодо встановлення hg-git у Windows .

    Після того, як у вас є hg-git, ви можете використовувати команди приблизно так, як розміщений вище Abderrahim Kitouni . Цей метод вдосконалюється та змінюється з 2009 року, проте існує дружня обгортка: git-hg-again . У цьому каталозі топлевель використовується робочий каталог одночасно для Mercurial і Git. Він створює закладку Mercurial, яка підтримує синхронізацію з кінчиком default(безіменної) гілки в сховищі Mercurial, і оновлює локальну гілку Git з цієї закладки.

  2. git-remote-hg - інша обгортка, також заснована наhg-gitрозширенніMercurial. Це додатково використовуєgit-remote-helpersпротоколи (звідси і його назва). Він використовує каталог топлевель лише для робочого каталогу Git; він зберігає своє сховище Меркурія голим. Він також підтримує друге голе сховище Git, щоб зробити синхронізацію між Git та Mercurial більш безпечною та ідіоматичною.

  3. ГИТ-Hg скрипт (раніше підтримується тут ) використовує інший метод, заснований на hg-fast-exportвід швидкого експорту проекту . Як і метод 2, цей також зберігає оголене сховище Mercurial і додатковий голий сховище Git.

    Цей інструмент ігнорує закладки Mercurial і замість цього імпортує кожну названу гілку Mercurial у гілку Git, а за замовчуванням (без назви) Mercurial гілку в master.

    Деякі коментарі розглядають цей інструмент як лише hg-> git, але він стверджує, що він об'єднався у підтримку git-> hg push 7 грудня 2011 року. Однак, як я пояснюю в огляді цих інструментів , як цей інструмент намагається реалізувати Підтримка натискань не здається справною.

  4. Також є ще один проект під назвою git-remote-hg . На відміну від перерахованої вище версії, ця не покладається на hg-git, а натомість безпосередньо отримує доступ до API Mercurial Python. Наразі для його використання також потрібна виправлена ​​версія git. Я ще цього не пробував.

  5. Нарешті, Tailor - це проект, який поступово перетворює між різними VCS. Здається, розвиток цього не буде агресивно тривати.

Перші три з цих підходів виглядали досить легкими, щоб переконати мене розслідувати. Мені потрібно було налаштувати їх деякими способами, щоб змусити їх працювати на моєму налаштуванні, і я побачив деякі способи їх ще більше налаштувати, щоб покращити їх, а потім я ще більше налаштував їх, щоб змусити їх поводитись більше, як один з одним, щоб я міг оцінити їх більш ефективно. Тоді я подумав, що й іншим, можливо, хотілося б зробити ці налаштування, щоб зробити таку ж оцінку. Тому я створив вихідний пакет, який дозволить вам встановити мої версії будь-якого з перших трьох інструментів. Слід також подбати про встановлення потрібних hg-fast-exportдеталей. (Вам потрібно встановити hg-gitсамостійно.)

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

Як я вже згадував вище, оцінюючи ці інструменти, я прийшов до висновку, який git-hgкорисний лише для витягування з Меркуріалу, а не для натискань.

Так само, ось деякі корисні порівняння / посібники з перекладу між Git та Mercurial, в деяких випадках націлені на користувачів, які вже знають Git:


2
Я сам використовую метод №2, а точніше - свою підроблену версію. В цілому, мені здається, найбільш надійний і гнучкий підхід (з тих, що я спробував). Докладніше див. Посилання на мій огляд / вихідний пакет.
— сумнівним

Так. Гармонія пічі - приголомшлива. Безкоштовно і для сольних розробників.
— CAD блокується

114

Є новий git-remote-hg, який забезпечує вбудовану підтримку:

Підтримка мосту в Git для Mercurial і Bazaar

Просто скопіюйте git-remote-hg у свій $ PATH, зробіть його виконуваним, і це все, без залежностей (крім Mercurial):

git clone hg::https://www.mercurial-scm.org/repo/hg/

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

Коли ви натискаєте нові гілки Git, для них будуть створені закладки Mercurial.

Додаткову інформацію див. У вікі- програмі git-remote-hg .


14
Гей Феліпе, це не зовсім так, вам потрібна робоча версія меркуріалу як залежність
— Антуан Пеліс

5
Переконайтесь, що ви точно називаєте його git-remote-hg(тобто немає .pyсуфікса).
— schmmd

3
Працює, коли сховище hg також є підмодулем.
— Клейтон Стенлі

4
Зауважте, що вам потрібен python 2. Отже, якщо python 3 є типовим у вашій системі (або якщо ви не запускаєте Debian і хочете бути доказовим), змініть перший рядок на #!/usr/bin/env python2.
— Кевін Кокс

4
Зауважте, що оскільки git-remote-hg Mercurial 3.2 @FelipeC більше не працює ( github.com/felipec/git-remote-hg/isissue/27 ), тобто поки вилка, яка виправляє проблему, не зростається (див. Github .com / fingolfin / git-remote-hg )
— Цимбалі

106

Ви повинні мати можливість використовувати hg-git .

hg clone <hg repository>

відредагувати ~/.hgrcта додати:

[extensions]
hgext.bookmarks =
hggit =

створіть закладку, щоб у вас з'явився mastergit:

cd <repository>
hg bookmark -r default master

редагуйте .hg/hgrcу сховищі та додайте:

[git]
intree = true

тепер ви можете створити сховище git:

hg gexport

і ви можете використовувати отриманий каталог як git-клон. витягнути з ртутного буде:

hg pull
hg gexport

і підштовхує до ртутних:

hg gimport
hg push

(Так, вам потрібно використовувати hg з цим робочим процесом, але ваше злому буде все в git)

PS Якщо у вас є проблеми з цим робочим процесом, будь ласка, подайте помилку.


3
не забувайте спочатку запустити easy_install hg-git
— Christian Oudard

1
Не зовсім те, що хотілося, але все-таки виконується. Дякую.
— Уго Серено Феррейра

3
Просто фій, після запуску цього процесу один раз на локальному hg-репо (і щось не так) я не зміг клонувати отримане репо за допомогою git. Мені довелося «клонувати hg» джерело hg repo, виконувати кроки на новій hg repo, а потім git клонувати нову hg repo.
— Rocky Burt

1
Я отримую це під час спроби видати git statusкоманду $ git status fatal: Цю операцію потрібно запустити в робочому дереві. Це після того, як я видав hg gexportсховище щойно клонованого hg. Яка можлива робота, щоб обійти голі сховища? Оновлення . Мабуть, пропозиція Рок-Берта працює. Дякую
— так,

1
@ThaDon У мене така ж проблема. Мабуть, git repo створюється як .hg / git. Рішення полягає в 'ln -s .hg / git .git'.
— mb14

15

Ви можете спробувати hg2git, що є сценарієм python і є частиною швидкого експорту, який ви можете знайти на веб-сайті http://repo.or.cz/w/fast-export.git .

Вам потрібно буде встановити ртутний код.


4
Це перетворило hg repo в git repo, дуже дякую!
— рекобата

Цей сценарій для мене не вдався, але оригінал hg-fast-exportспрацював чудово
— Андрій

Я думаю, що в даний час hg-fast-exportсценарій відправляється на hg2git. Я все ще не простежив цього. Зауважте, що ці інструменти дозволяють переходити лише з Hg-> Git, а не з зворотного.
— сумнівним

9

Оскільки hg-git є двостороннім мостом, він також дозволить вам пересувати набори змін з Git в Mercurial.


6

Hg-Git Mercurial Plugin . Я сам не пробував цього, але, можливо, варто перевірити.


7
Це плагін, який дає змогу користувачам, що вживають рядових, відштовхуватися від git repos.
— sykora

1
@sykora, він також може бути використаний для керування сумісністю з зворотного напрямку. Дивіться деякі інструменти, які я перелічу у своїй відповіді.
— сумнівним

6

Я мав великий успіх з git-hgвід https://github.com/cosmin/git-hg (вимагає роботи установки hg, теж). Він підтримує витягування, потягування та натискання і є більш стабільним для мене, ніж hg-git(подібні функції відhg git).

Див. Https://github.com/cosmin/git-hg#usage щодо прикладів використання. Користувацький інтерфейс дуже схожий наgit-svn .

git-hgВимагає додаткового дискового простору для кожного клонованого рт.ст. репо. В реалізації використовується повний ртутний клон, додатковий голий клон і власне git repo. Необхідний простір на диску приблизно в 3 рази перевищує звичайне використання лише git. Додаткові копії зберігаються під .gitкаталогом вашого робочого каталогу (або з місцем, вказаним GIT_DIRяк зазвичай).

Зверніть увагу: Основна проблема, яку git-hgнамагаються вирішити, полягає в тому, що між зображеннями gitта hgфункціями немає 1: 1 відображення . Найбільшою проблемою є невідповідність імпедансу між гітами git та hg неназваними гілками та hg з названими гілками та hg закладок (усі вони дуже схожі на гілки gitкористувачів). Пов'язана проблема полягає в томуhg намагається зберегти оригінальне ім'я гілки в історії версій на відміну від git, коли ім'я гілки додається лише до повідомлення про фіксацію шаблону за замовчуванням.

Будь-який інструмент, який вимагає створити сумісний міст між собою, gitі hgповинен пояснювати, як він має справу з цим співвідношенням імпедансу.Потім ви можете вирішити, чи обране рішення відповідає вашим потребам.

Використовуване рішення git-hgполягає в тому, щоб відмовитись від усіх закладів hg та перетворити названі гілки в гілки git. Крім того, він встановлює гілку master git за замовчуванням неназваною гілкою hg.


Схоже, git-hgвін життєздатний лише для витягування з Hg, а не для натискань (див. Пояснення, на яке я посилаюсь у своїй відповіді). Ви знайшли спосіб успішного використання його в обох напрямках? Щодо додаткового простору, усі методи, з якими я знайомий, включають робочий dir + одну копію git db / metadata + одну копію hg db / metadata. Додавання другої копії git db / метаданих передбачає більше використання диска, так, але порівняно кажучи, це не так погано, як може здатися.
— сумнівний

@dubiousjim Мої потреби були наповнені робочим потягом / витягненням, і я ніколи не перевіряв натиск. Я довіряв документації, але після перевірки ваших пояснень я вважаю, що git-hgце не підходить для просування. Я змінив свою відповідь, щоб зрозуміти, що pushвона недостатньо стабільна.
— Мікко Ранталайнен

Шкода, я думав, що може бути якийсь спосіб успішно використовувати натиск, який я не бачив.
— сумнівним

1
+1 за підкреслення невідповідності імпедансу і на що звернути увагу
— matt wilkie

3

Спробували hggit. Для мене працює, оскільки мені доводиться справлятися з роботою git'ers та hg'ers. Особливо для оглядів це чудово.

Невелика проблема / попередження на цю тему:

Я спробував клонувати стабільне сховище ядра Linux з hg. Ці сховища підтримуються в git і зазвичай мають велику кількість файлів.

Це було дуже повільно. У мене було 2 дні, щоб повністю клонувати та оновлювати робочу копію.


Здається, стає все краще --- моя каса працює вже близько шести годин, і вона стверджує, що є ще дев'ять ...
— Девід Дано

Я повертаю це назад. Зараз він працює близько 25 годин, і він все ще стверджує, що залишилося ще дев'ять. Два дні, ти сказав?
— Девід Даний

1
Я пережив це - моя перша спроба взагалі не спрацювала - я припускаю, що це була якась помилка, але ніколи не аналізував, що далі, у другій моїй спробі - з оновленим hg-git на моєму Mac Book знадобилося майже 50 годин. Pro (2.66GHz, 8 Gig RAM)
— Wizz

39 годин зараз, так що лише 11 їхати! Чотириядерний AMD Phenom. Він досягає прогресу, і тому я даю йому запуститись (розширення панелі прогресу hg - обов’язково). Це чергування між прив’язкою до одного процесора та взагалі без використання процесора та багато доступу до диска.
— Девід Даний

Хтось перевіряв, чи погана продуктивність викликана hggitабо hgзанадто повільною, щоб бути корисною для проектів розміром ядра взагалі?
— Мікко Ранталайнен

1

Я спробував git-hg cosmin та gour-hg-abourget і знову на mutt's hg repo , схоже, що пізніше поважає порядок об'єднання колодязя, колишній трохи випадковий. Ви можете бачити з скріншотів нижче.

Графік історії злиття барта, імпортованого git-hg cosmin :

введіть тут опис зображення

Графік історії злиття барта, імпортованого git-hg-знов abourget :

введіть тут опис зображення

Графік історії актуальної графіки, побудований hgk в сховищі hg mutt:

введіть тут опис зображення

Як видно з вищесказаного, другий графік git-hg-знов abourget знову дуже близький до початкового графіка hgk і насправді відображає реальний робочий процес шум.

Одним із недоліків git-hg-знову я виявив те, що він не додає 'hg' дистанційного керування, а імпортує всі свої refs у вигляді локальних тегів, git-hg має чудовий пульт 'hg', який представляє репо-версію hg.


1
Мені здається, що відмінності між версіями cosmin та abourget - це порядок батьків у об'єднанні. Хороший інструмент візуалізації історії (наприклад gitk) повинен мати можливість відображати обидві історії однаково. Єдине, очевидно, відсутність - це галузь hg/stableу версії abourget. Я здогадуюсь, що це річ між названими гілками, безіменними гілками та закладками в Mercurial.
— Мікко Ранталайнен

0

Двостороння синхронізація hg-git (і git-git, hg-hg) також можлива за допомогою сервісу Дзеркало Git-hg . Він використовує hg-git (серед інших) за лаштунками, і його код також є відкритим кодом.


Відмова : Я від компанії, що стоїть за цим.

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