Как я могу нажать / вытащить индивидуальный набор изменений между репозиториями в Mercurial? - PullRequest
14 голосов
/ 11 сентября 2010

У меня следующая ситуация:

  • У меня есть сайт A, на котором есть репозиторий Mercurial, и мы уже давно его разрабатываем.Допустим, у A было 5 ревизий.
  • Теперь нам нужно создать сайт B, который практически идентичен сайту A, за исключением графического дизайна, в основном.Поэтому я клонировал репо, запустил сайт B, и теперь репо B имеет всю историю A, а также набор изменений, которые никогда не должны возвращаться к A (в основном CSS и изображения).Допустим, эти изменения заняли у меня 3 ревизии.
  • Наконец, теперь я внес изменение в B, которое я хотел бы вернуть обратно в A, поскольку оно принадлежит обоим сайтам.Это ревизия 9 в репо B.

Вопрос: как я могу переместить ревизию 9 из репо B в репо A, не перемещая при этом ревизии 6-8?

  • Я пробовал обычное нажатие / извлечение, но это перемещает все наборы изменений.
  • Я пытался экспортировать пакеты или исправления, но те отказываются импортировать в A из-за отсутствия родителя.

Я думал, что одна из прелестей DVCS заключается в том, что я могу легко делать подобные вещи (которые в «централизованном» мире VCS я мог легко исправить с помощью веток и слияний, я много делал с Vault иэто довольно просто).

Я что-то здесь упускаю?

ПРИМЕЧАНИЕ: я посмотрел на "MQ", но это, похоже, большая банка червей, и похоже, что это будетвлияет на цикл регулярной фиксации только для того, чтобы быть включенным.Это правильно?

Любая помощь или указатели будут с благодарностью.Спасибо!

Даниил

Ответы [ 3 ]

11 голосов
/ 12 сентября 2010

Я думаю о командах так:

  • hg bundle дает вам двоичную версию набора изменений, а hg unbundle превратит пакет в точно такой же набор изменений на принимающей стороне.

    Пакет и разделение предназначены для передачи наборов изменений, скажем, по электронной почте, а двоичный патч зависит от наличия родительских наборов изменений.

  • hg export дает вам текстовое представление набора изменений, и если вы не используете флаг --exact командной строки для hg import, то применение этого патча не создаст точно такой же набор изменений на принимающей стороне.

    Преимущество отказа от использования --exact заключается именно в том, что вы можете применять такой патч в любом месте, пока нет текстовых конфликтов.

  • hg transplant - это просто тонкая оболочка вокруг hg export и hg import.

11 голосов
/ 11 сентября 2010

https://www.mercurial -scm.org / вики / вики / TransplantExtension

См. В разделе «Использование трансплантата для выбора набора изменений»:

Transplant может управлять несколькими наборами изменений или диапазонами изменений, такими как это:

hg transplant REV1:REV2 REV3

В этом примере будет выбран диапазон изменений, заданный REV1: REV2 и дополнительный набор изменений REV3 для рабочего каталога пересмотр.

В идеале вы бы сделали это с ответвлениями?

1 голос
/ 10 апреля 2011

Если вы хотите «свернуть» или пропустить историю в ртутном репо, вы просто обновляете базовую ревизию (перед разделом, который вы хотите свернуть).Если вы хотите сложить все вышеупомянутое в один набор изменений (это, кажется, то, что вы хотите), вы просто возвращаете в заголовок этой ветви и фиксируете это (или фиксируете только те файлы, которые хотите).Это создаст новую ревизию с тем материалом, который вы хотите, чтобы вы могли перенести его на свой сайт А. Материал, который вам не нужен, вы просто игнорируете (или лишаете его, если не можете его игнорировать).

Если у вас есть несколько наборов изменений выше вашего фолда, которые вы хотите сохранить, вы должны rebase .Включите расширение rebase и перебазируйте # 9 на # 5.Если есть дети №9, они будут перемещены вместе с ним.Rebase предпочтительнее, чем трансплантат (который делает аналогичные вещи), потому что rebase использует механизм трехстороннего слияния для переноса наборов изменений, что повышает его вероятность успеха.Пересадка более или менее просто тупой экспорт-импорт, поэтому она игнорирует общую историю.

...