FreeSource : AltLinux/Sisyphus/devel/git/MergingBranches

Эта страница была перенесена на altlinux.org. Текст на freesource.info заморожен.

Как хранить каждый патч в отдельном бранче

статья на основе письма raorn
raorn@

Как вы все наверно знаете, наш mutt1.5 это такой mutt2ng-new с большим количеством «левых» патчей. Из-за такого количества каждое обновление версии превращается в изощрённую пытку для мантейнера. По идее git должен бы помочь решить подобные проблемы...

Сначала я посмотрел на kernel-image. Там каждый патч живёт в отдельном бранче, перед релизом всё мержится в master. Примерно так:
master
          *  merge-C
         /|
        / *  merge-B
       / /|
      / / *  merge-A
     / / /|
    / / / *  merge-upstream
   / / / /|
  * | | | |  patchC
  | * | | |  patchB
  | | * | |  patchA
   \ \ \| |
    ±±* |  upstream
        | |


По каждому патчу конфликт разруливается сначала в patchX, потом в merge-X. При обновлении версии upstream и/или patchX приходится делать маленький закат солнца вручную с повторным разруливаением всех конфликтов. Это не ядро и патчи имеют обыкновение пересекаться во множестве мест.

Результат этого изврата ещё некоторое время можно будет наблюдать в моём mutt1.5.git.


Есть второй способ, который посоветовал мне voins (на примере его stklos.git и Window Maker.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:


Страницы, ссылающиеся на данную: AltLinux/Sisyphus/devel/git