05 марта 2026 № 1 (2026)

ROSARIUM

газета советского программиста

Backport из upstream

На этой странице

Сценарий

Допустим, в upstream-репозитории htop есть коммит, который исправляет ошибку отображения. Мы хотим забрать этот коммит в наш пакет версии 3.3.0, не обновляясь до следующей версии.

Полный рабочий процесс

# Шаг 1: Клонируем upstream-репозиторий
cd /tmp
git clone https://github.com/htop-dev/htop.git
cd htop

# Шаг 2: Находим нужный коммит
# Можно искать по описанию:
git log --oneline --all | grep -i "fix"

# Или по файлу:
git log --oneline -- Process.c

# Допустим, нашли коммит abc1234
# Шаг 3: Переключаемся на ветку нашей версии
git checkout 3.3.0

# Шаг 4: Пробуем cherry-pick
git cherry-pick abc1234

Если cherry-pick прошёл без конфликтов:

# Шаг 5: Создаём патч
git format-patch -1 --stdout > ~/rpmbuild/SOURCES/0002-Backport-fix-display-bug.patch

Если возник конфликт

При cherry-pick git может сообщить:

error: could not apply abc1234... Fix display bug
hint: After resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>', then run 'git cherry-pick --continue'.

Что делать:

# Шаг 1: Посмотрите, какие файлы конфликтуют
git status

Вывод:

Unmerged paths:
  both modified:   Process.c
# Шаг 2: Откройте файл и найдите конфликтные маркеры
grep -n '<<<<<<' Process.c

Вы увидите что-то вроде:

<<<<<<< HEAD
    // код из версии 3.3.0
    old_function(arg);
=======
    // код из коммита abc1234
    new_function(arg);
>>>>>>> abc1234
# Шаг 3: Отредактируйте файл — оставьте правильный вариант,
# удалите маркеры <<<<<<<, =======, >>>>>>>

# Шаг 4: Отметьте конфликт как разрешённый
git add Process.c
git cherry-pick --continue

.rej-файлы при использовании patch

Если вы применяете патч не через git, а через patch, конфликтные куски сохраняются в файлы .rej:

Process.c.rej

Содержимое .rej показывает, какие изменения не удалось применить. Вам нужно вручную внести эти изменения и пересоздать патч.

Добавление backport-патча в SPEC

Patch0:  0001-Disable-Werror-for-distribution-builds.patch
Patch1:  0002-Backport-fix-display-bug.patch

%prep
%autosetup -p1
autoreconf -fi

%autosetup -p1 применит оба патча по порядку.

Не забудьте обновить %changelog:

%changelog
* Sat Feb 08 2026 Your Name <your@email.com> - 3.3.0-3
- Backport fix for display bug from upstream (abc1234)

* Sat Feb 08 2026 Your Name <your@email.com> - 3.3.0-2
- Disable -Werror to fix build with GCC 14

Обслуживание патчей при обновлении версии

Когда upstream выпускает новую версию (например, 3.4.0), ваши патчи могут перестать применяться. Рабочий процесс обновления:

# 1. Обновите Source0 и Version в SPEC
# 2. Попробуйте собрать
rpmbuild -bp htop.spec   # только %prep — проверяем, применяются ли патчи

# 3. Если патч не применился — нужно адаптировать:
cd ~/rpmbuild/BUILD/htop-3.4.0/
# Примените патч вручную:
patch -p1 < ~/rpmbuild/SOURCES/0001-Disable-Werror-for-distribution-builds.patch
# Если есть .rej файлы — исправьте вручную

# 4. Проверьте, не вошёл ли фикс в новую версию
# Если вошёл — удалите патч из SPEC (и файл из SOURCES)

# 5. Пересоздайте патч, если нужно:
git init && git add . && git commit -m "Import 3.4.0"
# ... внесите изменения ...
git format-patch -1 --stdout > ~/rpmbuild/SOURCES/0001-Disable-Werror-for-distribution-builds.patch

Совет: при каждом обновлении проверяйте, не были ли ваши патчи приняты в upstream. Если да — удалите патч. Чем меньше патчей, тем проще жизнь.