gitum

gitum Git Upstream Manager

gitum держит ваши изменения к чужому проекту поверх его апстрима, релиз за релизом, без merge-коммитов и без потери их истории. В любой момент видно, что с каждым вашим изменением: только наше, отправлено в апстрим, принято или заменено исправлением апстрима.

Он сделан для форков с множеством патчей (вроде wine-rebased), для пакетов дистрибутивов и для серий изменений на пути в апстрим.

Зачем

Обновлять форк обычным git — значит выбирать из двух плохих вариантов. При merge ваши изменения уходят вглубь истории и теряются среди тысяч коммитов апстрима. При rebase они остаются сверху, но их история теряется, а ветка переписывается для всех остальных.

merge, rebase и gitum

gitum даёт и то и другое: ваши изменения остаются сверху, в обычной git-ветке, а каждое состояние записано в историю, которая только растёт.

Как это работает

Ваши изменения живут в слое — обычной ветке поверх апстрима (слои можно складывать стопкой). Когда апстрим выпускает релиз, gitum sync переносит на него ваши изменения и записывает новое состояние:

gitum sync

В слое вы работаете обычным git: commit, amend, rebase. gitum save записывает сделанное, а прежние версии ваших изменений остаются доступны:

gitum save

Когда апстрим принимает одно из ваших изменений, оно само исчезает из слоя при следующем sync, а gitum помнит, куда оно ушло:

принято апстримом

Конфликт останавливает sync, не трогая ваши ветки: вы его разрешаете и запускаете gitum continue. Падение в любой момент ничего не теряет.

Установка

Нужны Python 3.11 и git 2.45, больше ничего.

В ALT Linux:

epm install gitum

Из исходников:

pip install ./gitum

Быстрый старт

Держать форк в синхронизации с апстримом:

cd myproject                     # ваш клон, апстрим подключён как remote
gitum init --upstream up=upstream/master --release-tags 'v*' --layer mine=my-branch
gitum status                     # где что находится
gitum sync --next-release        # перенести ваши изменения на следующий релиз
gitum continue                   # после разрешения конфликта, если он был
gitum publish                    # поделиться результатом

Отправить серию изменений в апстрим:

gitum series add my-fix --base upstream:up    # ветка series/my-fix
gitum prepare my-fix --push fork              # привести её в порядок на свежем master
gitum check-upstream series:my-fix --apply    # позже: приняли ли её?

Документация

Лицензия

GPL-2.0-or-later, см. gitum/COPYING.