Как я могу нажать/вытащить индивидуальный набор изменений между репозиториями в 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 для миграции наборов изменений, что делает его более успешным. Трансплантация - это более или менее простой экспорт-импорт, поэтому он игнорирует общую историю.