Git/MergingBranches: различия между версиями
Ilis (обсуждение | вклад) Нет описания правки |
Oxyum (обсуждение | вклад) |
||
Строка 46: | Строка 46: | ||
1. upstream | 1. upstream | ||
patchA <- upstream | <pre>patchA <- upstream | ||
patchB <- patchA | patchB <- patchA | ||
… | … | ||
master <- patchZ | master <- patchZ</pre> | ||
2. patchX | 2. patchX | ||
<pre> | |||
branch patchX-tmp upstream | branch patchX-tmp upstream | ||
накладываем новый patchX в patchX-tmp | накладываем новый patchX в patchX-tmp | ||
Строка 61: | Строка 61: | ||
… | … | ||
master <- patchZ | master <- patchZ | ||
</pre> | |||
3. patchX и upstream | 3. patchX и upstream |
Версия от 18:13, 14 июня 2009
Хранение патчей в отдельных бранчах git-репозитория
Предисловие
Наш mutt1.5 это такой mutt2ng-new с большим количеством «левых» патчей. Из-за такого количества каждое обновление версии превращается в изощрённую пытку для мантейнера. Посмотрим, как git может помочь решить подобные проблемы.
Общий мёрж в master
Посмотрим на kernel-image. Там каждый патч живёт в отдельном бранче, перед релизом всё мержится в master. Примерно так:
master * merge-C /| / * merge-B / /| / / * merge-A / / /| / / / * merge-upstream / / / /| * | | | | patchC | * | | | patchB | | * | | patchA \ \ \| | +-+-* | upstream | |
По каждому патчу конфликт разруливается сначала в patchX, потом в merge-X. При обновлении версии upstream и/или patchX приходится делать маленький закат солнца вручную с повторным разруливаением всех конфликтов. Это не ядро и патчи имеют обыкновение пересекаться во множестве мест.
Последовательный мёрж бранчей
Есть второй способ, который применяет voins (например, см. его stklos.git и WindowMaker.git). upstream мержится в patchA, patchA в patchB и так далее. При этом конфликты разруливаются практически только один раз при мерже patchN-1 в patchN:
master * |\ | * patchC | |\ | | * patchB | | |\ | | | * patchA | | | |\ | | | | * upstream | | | | |
Что делать при обновлении upstream и/или patchX?
1. upstream
patchA <- upstream patchB <- patchA … master <- patchZ
2. patchX
branch patchX-tmp upstream накладываем новый patchX в patchX-tmp patchX-tmp <- patch(X-1) patchX <- patchX-tmp branch -d patchX-tmp patch(X+1) <- patchX … master <- patchZ
3. patchX и upstream
До patch(X-1) поступаем аналогично 1., потом аналогично 2.
Автоматизация процесса последовательного мёржа
Автоматизировать процесс можно с помощью утилиты gear-merge. Утилита довольно простая. Краткий синтаксис правил описан в заголовке (vim /usr/bin/gear-merge), опции описаны в man-странице.
Вот так выглядит файл правил для мёржа на примере inn.git:
% cat .gear/merge merge: upstream patches/debian/0001-libdb-4.4 merge: patches/debian/0001-libdb-4.4 patches/alt/001-cdb merge: patches/alt/001-cdb patches/alt/002-db4 merge: patches/alt/002-db4 patches/alt/003-docs merge: patches/alt/003-docs patches/alt/004-gdbm merge: patches/alt/004-gdbm patches/alt/005-pie merge: patches/alt/005-pie patches/alt/006-2.4.2-alt merge: patches/alt/006-2.4.2-alt patches/alt/007-krb5 merge: patches/alt/007-krb5 patches/alt/008-Makefile merge: patches/alt/008-Makefile master
Ссылки