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

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

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

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

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

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

Я что-то пропустил?

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

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

Daniel

Ответы

Ответ 1

https://www.mercurial-scm.org/wiki/wiki/TransplantExtension

См. в разделе "Использование трансплантата для черри набора наборов изменений":

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

hg transplant REV1:REV2 REV3

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

В идеале вы делаете это с помощью ветвей?

Ответ 2

Я думаю о командах следующим образом:

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

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

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

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

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

Ответ 3

Если вы когда-либо захотите "свернуть" или пропустить историю в Mercurial repo, вы просто обновите базовую ревизию (перед разделом, который вы хотите сбросить). Если вы хотите сложить все выше этого в единый набор изменений (это похоже на то, что вы хотите), вы просто возвращаетесь к голове этой ветки и фиксируете это (или фиксируете только нужные файлы). Это создаст новый набор изменений с нужным вам материалом, чтобы вы могли подтолкнуть его к вашему сайту A. То, что вам не нужно, вы просто игнорируете (или разделите его, если не можете его игнорировать).

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