Воспитание в Mercurial: как собрать вместе два независимых svn-клона? - PullRequest
6 голосов
/ 05 мая 2011

Вот ситуация: разработчик Foo создал репозиторий hg из нашего репозитория svn. Репозиторий Hoo Foo был лишь поверхностным клоном ствола в svn (без svn-веток, тегов и т. Д., А история была неполной [около 100 наборов изменений]). Developer Bar сделал то же самое, но клонировал весь репозиторий SVN, включая всю историю, ветки, теги и т. Д. И Foo, и Bar выполнили разветвленную разработку для своих репозиториев.

Существует общий предок SVN для обоих репозиториев, но у каждого репозитория hg свой номер версии. Я хотел бы переписать изменения Фу с общего предка на репо Бар. Вот схема того, что я ищу:

Репо Фу:

C'-D'-E-F---G
       \   /
        H-I

Репо бара:

...A-B-C-D-J-K---L
            \   /
             M-N

C, C 'и D, D' имеют одинаковое содержимое, но разные номера версий и комментарии.

Цель:

...A-B-C-D--E-F---G
          \  \   /
           \  H-I
            \
             J-K---L
              \   /
               M-N

У меня закончились идеи о том, как это сделать. Я попытался преобразовать --splicemap splice.map [файл splice.map, содержащий E D] (ничего не сделал). Clone -f удалось собрать все в один репозиторий, но они кажутся независимыми деревьями. После клона -f я попытался перебазировать --source E --dest D --detach, но он просто потерпел крах: (

Идеи

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

Ответы [ 3 ]

2 голосов
/ 06 мая 2011

РЕШЕНО!

Первоначально я не заметил, что мой предполагаемый общий предок не был точно таким же.Во время преобразования репозитория Foo в svn-> hg строки $ ID $ были расширены, но не были созданы в репо Бар.Шаг 1, приведенный ниже, был простым исправлением для создания РЕАЛЬНОГО общего предка.

Следующие шаги позволили мне достичь моей цели:

1- Убедитесь, что предполагаемый общий предок(D и D ') фактически идентичны.Если нет, создайте новую точку сращивания для них (S) в репо Бар.S должен точно соответствовать содержанию D 'в моем примере.

    ...A-B-C-D--J-K---L
              \  \   /
               S  M-N

2- Обрезать историю репо Foo, чтобы удалить дублирующую историю, включая D', с помощью

    hg convert --splicemap TrimSplicemap Foo FooTrimmed

Содержимое TrimSplicemap: (где E - полный хэш E)

    E 0000000000000000000000000000000000000000

3- Используйте полосу hg, чтобы удалить отключенную избыточную историю

    cd FooTrimmed
    hg strip C'

4- Снова используйте hg convert для скрепления раздетого репо Фу с репо Баром при коммите 'S'

    cd ../Bar
    hg convert --splicemap FooBarSplicemap ../FooTrimmed .

FooBarSplicemap content: (где E '- новый хешдля E в FooTrimmed, а S - хеш S)

    E' S

Это должно сделать это!: D

1 голос
/ 06 мая 2011

Мы говорили об этом сегодня в IRC, и мой совет состоял в том, чтобы просто втянуть оба в один репо и позволить ему иметь два корня. Головы будут именно такими, как вы хотите, а остальное действительно не имеет значения.

Если вы просто не можете этого пережить (вы представляете, что люди используют историю / вину больше, чем они на самом деле), то я думаю, что ваша карта соединения должна иметь:

E D

in, так как вы пытаетесь заставить родителя E быть D (не D ')

1 голос
/ 06 мая 2011

Вы могли бы быть в состоянии выполнить это, используя Mercurial Queues .

  1. Импорт всех изменений из репо Foo в очередь исправлений.
  2. Перейти к репо Bar.
  3. Обновление Bar до набора изменений, который является общим предком.
  4. Импорт очереди исправлений в Bar.
  5. Применить очередь исправлений.

Это изменит идентификаторы всех патчей Foo, но при этом позволит вам сохранить всю историю и объединить их репозитории Dev.

...