Проблема рабочего процесса от Mercurial к Mercurial к Subversion

Мы переходим с Subversion на Mercurial. Чтобы облегчить миграцию, мы создаем промежуточный репозиторий Mercurial, который является клоном нашего репозитория Subversion. Все разработчики начнут переходить на репозиторий Mercurial, и мы будем периодически перемещать изменения из промежуточного репозитория Mercurial в существующий репозиторий Subversion. По прошествии некоторого времени мы просто устареем репозиторий Subversion, и промежуточный репозиторий Mercurial станет новой системой записи.

Dev 1 Local --+--> Mercurial --+--> Subversion
Dev 2 Local --+                +
Dev 3 Local --+                +
Dev 4 -------------------------+

Я тестировал это, но продолжаю сталкиваться с проблемой, когда отправляю изменения из моего локального репозитория в промежуточный репозиторий Mercurial, а затем в наш репозиторий Subversion.

http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/01.png

На моем локальном компьютере у меня есть набор изменений, который зафиксирован и готов к отправке в наш промежуточный репозиторий Mercurial. Здесь вы видите ревизию # 2263 с хешем 625 ...

http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/02.png

Я отправляю только эту ревизию в удаленный репозиторий.

http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/03.png

Пока все выглядит хорошо. Набор изменений отправлен.

hg update
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

Теперь я переключаюсь на удаленный репозиторий и обновляю рабочий каталог.

hg push
pushing to svn://...
searching for changes
[r3834] bmurphy: database namespace
pulled 1 revisions
saving bundle to /srv/hg/repository/.hg/strip-backup/62539f8df3b2-temp
adding branch
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
rebase completed

Затем я отправляю изменения в Subversion, отлично работает. На данный момент изменение находится в репозитории Subversion, и я снова обращаю внимание на своего локального клиента.

http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/04.png

Я загружаю изменения на свой локальный компьютер. Хм? Теперь у меня есть две ревизии. Моя исходная ревизия теперь отображается как локальная ветка.

http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/05.png

Другой набор изменений имеет новый номер ревизии 2264 и новый хэш 10c1 ...

http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/06.png

В любом случае, я обновляю свое локальное репо до новой версии.

http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/07.png

Я сейчас переключился.

http://bmurphy.mediafly.com.s3.amazonaws.com/images/mercurial/08.png

Итак, я, наконец, нажимаю «определить и отметить исходящие наборы изменений», и, как вы можете видеть, Mercurial все еще хочет выпустить мои предыдущие наборы изменений, даже если они уже были отправлены.

Ясно, что я что-то не так делаю.

Я также не могу объединить две ревизии. Если я объединю две ревизии на моем локальном компьютере, я получу коммит «слияния». Когда я отправляю эту фиксацию слияния в промежуточный репозиторий Mercurial, я больше не могу отправлять изменения в наш репозиторий Subversion. У меня возникает следующая проблема:

hg update
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

hg push
pushing to svn://...
searching for changes
abort: Sorry, can't find svn parent of a merge revision.

и мне нужно откатить слияние, чтобы вернуться в рабочее состояние.

Что мне не хватает?


person bmurphy1976    schedule 23.03.2010    source источник
comment
Все изображения повреждены: - \   -  person Paul Wagland    schedule 23.10.2010


Ответы (3)


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

hgsubversion действительно хорош для двух вещей:

  1. использование Mercurial в качестве клиента для Subversion, без обмена изменениями вне svn
  2. Преобразование репозиториев Subversion в Mercurial

Вы пытаетесь использовать его как более универсальный шлюз, что является гораздо более сложной проблемой. У Subversion очень жесткий взгляд на мир, и мы должны работать с ним. Дело в том, что хеш ревизии можно рассматривать как окончательный только при использовании hgsubversion после того, как ревизия была извлечена из Subversion. Таким образом, если ваши разработчики когда-либо делятся наборами изменений между репозиториями Mercurial напрямую, без Subversion в качестве посредника, это произойдет.

Перебазирование выполняется автоматически и не является обязательным по очень фундаментальной причине: Subversion выполняет это перебазирование, когда вы нажимаете. Если у вас были невыполненные изменения, когда вы нажимали, Subversion сделала это за вас, и в случае успеха (с глупо простым алгоритмом перебазирования) она принимает фиксацию без каких-либо указаний на то, что перебазирование произошло. Мы собираем вместе две разные модели.

Я бы порекомендовал всем сразу перейти на Mercurial - такой гибридный подход только сделает использование Mercurial более трудным в краткосрочной перспективе, чем должно быть, и потенциально запутает пользователей, плохо знакомых с DVCS.

person durin42    schedule 25.03.2010
comment
@dalroth потребуется такой процесс: пользователь отправляет r1: r2 на hg-gateway, hg-gateway должен автоматически подтолкнуть к subversion, теперь пользователь должен тянуть, и, наконец, пользователь должен hg strip r1 - person Harvey; 07.05.2010
comment
@ Харви - Могу я получить разъяснения? У меня есть команда, которая хотела бы перейти на hg, но здесь svn правит пустошью. Если мы настроим главное репозиторий hg и будем нажимать / вытягивать оттуда только мастер svn, все будет в порядке? Более длинная версия: мой босс не возражает, если мы перейдем на hg, но только если одна команда сначала выполнит пилотную программу. Там достаточно общего кода (не говоря уже о том, что на машине сборки все еще работает svn), поэтому о полном переключении на hg не может быть и речи. - person moswald; 25.05.2010
comment
@mos: Это сработает, я лично этим занимаюсь. Уловка состоит в том, чтобы изучить модифицированный рабочий процесс hg ‹-› hgsubversion ‹-› svn. Как только вы поймете, как это работает, у вас не будет никаких проблем. Вы просто наберете еще несколько команд. На самом деле я начал писать сценарии, чтобы упростить этот повторяющийся процесс. Типичный поток: [в hg repo] фиксирует кучу изменений; подтолкнуть их к hgsubversion; [переключиться на hgsubversion] hg update (это необходимо для hgsubversion); hg push to svn (который автоматически извлекается повторно после того, как вы нажимаете и удаляет ваши наборы изменений локально); ... продолжение следует ... - person Harvey; 24.06.2010
comment
@mos: ... [вернуться к hg] hg pull из hgsubversion; hg удалить старые дубликаты b / c hg не является клоном hgsubversion и не знает, как автоматически удалить старые наборы изменений - person Harvey; 24.06.2010

Во-первых, позвольте мне сказать, какое удовольствие было прочитать такой подробный вопрос. :)

Проблема возникает, когда вы делаете hg push в репозиторий svn удаленно. Вот результат вашего примера:

hg push
pushing to svn://...
searching for changes
[r3834] bmurphy: database namespace
pulled 1 revisions
saving bundle to /srv/hg/repository/.hg/strip-backup/62539f8df3b2-temp
adding branch
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
rebase completed

Я не являюсь пользователем hg-subversion, но в этих выходных данных говорится, что в процессе выполнения запрошенного вами нажатия он извлекает изменения из репозитория svn, находит новую ревизию и затем выполняет rebase вашего набора изменений 10c1 после (потомок из) только что вытянутой ревизии. Команда rebase берет истории ветвления и превращает их в линейные истории, но при этом меняет родители ревизий, которые изменяют их хэши, что похоже на то, что происходит с вами.

Опять же, не пользователь hg-subversion, поэтому я не могу сказать, всегда ли должно происходить это извлечение / перебазирование и как это должно работать, но hgsubversion на странице вики говорится:

Вы можете использовать обычные команды Mercurial для работы с этим репозиторием. Если у вас есть серия коммитов в данной ветке и вы хотите переместить их в конец этой ветки, используйте команду hg rebase --svn, находясь на кончике вашей работы, и эти ревизии будут автоматически перебазированы поверх новая работа в апстриме.

что заставляет его звучать не обычно автоматически.

Я не мог точно сказать из вашего вступления, новые ревизии все еще создаются в svn, или они создаются только в mercurial?

Если они создаются только в mercurial, то одним из способов решения этой проблемы было бы создание репозитория svn-gateway в удаленной системе и выполнение push оттуда, а не извлечение из этого репо обратно в mercurial. Тогда наборы изменений в этом репо будут иметь разные хеши из-за перебазирования, но они не будут возвращаться в основное удаленное репо и системы конечных пользователей.

Но главное исправление - выяснить, почему «hg push svn: // .. меняет все исходящие ревизии». Ответьте на этот вопрос, и поведение прекратится.

person Ry4an Brase    schedule 24.03.2010
comment
Я попытался рассмотреть это поближе, но все равно безуспешно. Я не могу найти способ hg push из промежуточного репозитория без автоматического перебазирования, а hg rebase --svn ничего не делает, потому что это уже самая последняя версия. - person bmurphy1976; 24.03.2010
comment
Да, поговорите с ребятами из hg-subversion о том, почему он выполняет перебазирование и можно ли этого избежать. Боюсь, я годен только для работы (что и делает решение с 3 репо). - person Ry4an Brase; 25.03.2010
comment
@Dalroth, @ Ry4an: hgsubversion должен выполнить перебазирование из-за особенностей подрывной деятельности. Окончательным решением было бы, если бы hgsubversion могла определять, когда вы делаете клон hg клона hgsubversion. Затем он автоматически выполнит необходимые нисходящие стрипы и перебазировки. Я использую этот процесс сейчас на работе. Это работает, но к этому нужно привыкнуть. Ситуация усложняется, если ваш клон hgsubversion не обновляется автоматически на сервере Subversion (потому что вам нужно извлечь из SVN, а затем перенастроить свои изменения на новую подсказку). - person Harvey; 24.06.2010

Теперь мы используем команду graft, чтобы сделать что-то подобное. Фактически мы воссоздаем каждую ревизию перед ее продвижением, чтобы избежать необходимости подталкивать слияния-ревизии.

Наша цель - внести свой вклад в проект, в котором используется Subversion.

  • Создайте ветку Subversion для всех ваших изменений. Получите это в Mercurial.
    $ cd [svn-checkout] ; svn cp trunk branches/hg-bridge
    $ cd [hgsubversion bridge] ; hg pull ; hg update hg-bridge

  • Проверьте свое местное репо на наличие новых изменений
    $ hg in [repo] # shows <rev> IDs you can use later

  • Извлеките изменения, которые вы хотите получить в svn, из локального репо
    $ hg pull [repo]

  • Внесите все изменения, которые вы хотите внести:
    $ hg graft [rev] [rev] # rev could be 645 or b7a92bbb0e0b. Best use the second>.
    Вам нужно указывать каждую ревизию индивидуально,
    но вы можете перенести несколько ревизий с помощью одной команды.

  • Проверьте, что вы хотите отправить:
    $ hg outgoing

  • Отправьте изменения:
    $ hg push
    Это может показать некоторые несвязанные извлеченные версии
    и должны показать ваши новые версии как извлеченные,
    вместе с пути к пакетам резервных копий (которые вам не понадобятся). (комментарий также можно использовать под GPLv2 или более поздней версии)

person Community    schedule 25.05.2012