Проблема Mercurial с Mercurial с Subversion Workflow

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

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

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

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

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

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

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

alt text 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, и я возвращаю внимание на мой локальный клиент.

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

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

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

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

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

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

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

Теперь я переключился.

alt text 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.

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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 своего changeet 10c1 после (потомка) вновь выведенной ревизии. Команда rebase берет ветвящиеся истории и превращает их в линейные истории, но при этом они меняют родителей изменений, которые меняют свои хэши, который выглядит как раз то, что происходит с вами.

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

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

что делает звук не нормальным.

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

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

Большее исправление, однако, состоит в том, чтобы выяснить, почему "hg push svn://.. перезагружает все исходящие изменения". Ответьте, что одно и поведение прекратятся.

Ответ 3

Теперь мы используем команду трансплантата, чтобы сделать что-то похожее на это. Эффективно мы воссоздаем каждый набор изменений перед тем, как нажимать его, чтобы не нажимать команды слияния.

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

  • Создайте ветвь 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>.
    Вы должны указать каждый rev отдельно,
    но вы можете трансформировать несколько оборотов в одну команду.

  • Проверьте, что вы нажимаете:
    $ hg outgoing

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