Взаємодія 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.