Mercurial - перебазировать ветку старого кода поверх новой подсказки кода, игнорируя слияния ветки со старым кодом

Я играл с исходным кодом Adium и обнаружил, что у них есть неизданная ветвь в adium-1.4 это исправляет интеграцию чата Facebook с помощью XMPP, называемого facebook-xmpp, Все хорошо, выполнил и все работает.

Проблема в том, что, если бы я хотел иметь ту же функциональность в последней версии Adium 1.5, чей код был отделен от более старой версии около двух лет назад (с некоторыми изменениями из старой версии, время от времени пересаживаемыми), я решил, что " Я должен каким-то образом перебазировать весь диапазон наборов изменений, которые составляют facebook-xmpp ветвь и применить его на кончике новее adium-1.5 ветка. Я думал, что это может сработать, так как facebook-xmpp Похоже, что он в основном добавляет новый код, поэтому он должен быть легко интегрирован с новейшим кодом разработки.

Тем не менее, так как facebook-xmpp ветка слилась с adium-1.4 несколько раз я обнаружил, что перебазирование будет тянуть в объединенные изменения из adium-1.4 на adium-1.5 а также, что делает много конфликтов слияния.

---------------------------------------  adium-1.4
               |                   \---  facebook-xmpp (created 1 month ago)
               |
               \-----------------------  adium-1.5
               ^ sometime in 2009

Вопрос в том, есть ли способ пересадки на adium-1.5 только наборы изменений, которые добавлены к facebook-xmpp филиал, исключая те, которые слились с adium-1.4?

1 ответ

Решение

Способ 1 (ручное исправление)

Если вы просто хотите facebook-xmpp функциональность будет доступна в audium-1.5, вы могли бы

  1. слить кончик audium-1.4 в facebook-xmpp, затем
  2. создать разницу между кончиками audium-1.4 а также facebook-xmpp а также
  3. попробуйте наложить этот патч на кончик adium-1.5.

Это должно работать, но новый патч отключен от оригинальной истории разработки.

--------o---o    <- tip of audium-1.4
   \     \   \
    \     o---o  <- tip of facebook-xmpp (all audium-1.4 changes merged in)
     \
      o-------o  <- tip of audium-1.5 (apply patch here)

В основном эти команды должны сделать это:

$ hg up facebook-xmpp
$ hg merge audium-1.4
$ hg commit -m "Merge audium-1.4 into facebook-xmpp"
$ hg diff -r audium-1.4 -r facebook-xmpp > fbx.patch # facebook-only changes
$ hg up audium-1.5
$ hg import fbx.patch # good luck

Способ 2 (выборочное слияние)

Другое решение, которое демонстрирует больше уважения к графу истории, - это непосредственное слияние facebook-xmpp в audium-1.5 при использовании конфигурации инструмента слияния, которая использует internal:local как инструмент слияния по умолчанию (чтобы инструмент слияния не появлялся 1000 раз), но он регулярно сливается для любого facebook-xmpp связанные файлы (если вы знаете, какие файлы связаны с его функциональностью). Затем, перед совершением слияния, верните все файлы, не связанные с фейсбуком.

ОБНОВЛЕНИЕ: Вот несколько примеров инструкций для этого второго решения. Предполагается facebook-xmpp ветка создала несколько новых файлов с именем fb-<something>.c и изменил существующие файлы foo.c а также bar.c (вы получаете эти файлы из различий между facebook-xmpp и его последнее слияние с audium-1.4). При слиянии facebook-xmpp в audium-1.5используйте следующую конфигурацию инструмента слияния:

$ hg up audium-1.5
$ hg --config ui.merge=internal:local \
     --config merge-patterns.fb-*.c=internal:merge \
     --config merge-patterns.foo.c=internal:merge \
     --config merge-patterns.bar.c=internal:merge \
     merge facebook-xmpp

Первый конфиг слияния гарантирует, что в целом audium-1.5 изменения хранятся в файлах, измененных в обоих audium-1.4 а также audium-1.5, Другие параметры конфигурации гарантируют, что для любых файлов, затронутых facebook-xmpp ветвление выполняется регулярное слияние, потенциально с конфликтами, которые должны быть решены вручную. Например, если foo.c поднял конфликты, беги

$ hg resolve foo.c

чтобы решить конфликты с вашим любимым инструментом ручного слияния. Наконец, вы должны зафиксировать слияние, не фиксируя новые файлы, созданные в audium-1.4, Просто совершите facebook-xmpp материал:

$ hg ci -I "fb-*.c" -I foo.c -I bar.c
$ hg up -C # get rid of remaining new files from audium-1.4
Другие вопросы по тегам