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
, вы могли бы
- слить кончик
audium-1.4
вfacebook-xmpp
, затем - создать разницу между кончиками
audium-1.4
а такжеfacebook-xmpp
а также - попробуйте наложить этот патч на кончик 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