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

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

Проблема в том, что если бы я хотел иметь такую ​​же функциональность в последней версии 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 Ответ

3 голосов
/ 10 мая 2011

Способ 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 (вы получаете эти файлы из diff между 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
...