Проверьте, соответствует ли запрос на получение обновлений целевой ветки

Наш проект использует защищенные ветки и требует, чтобы базовая ветвь PR была обновлена ​​с целевой ветвью для слияния. Мы также используем Jenkins для создания невостребованной главы PR, потому что плагин, который мы используем, автоматически перестраивает все открытые PR, когда изменяется целевая ветвь, которая может быстро засорить конвейер. Таким образом, в случае, когда PR открывается, не обновляясь с целевой ветвью, мы хотим иметь возможность немедленно остановить трубопровод Jenkins и сообщить коммиттеру, что им нужно сначала слить.

Итак, используя API GitHub, я хотел бы узнать, обновлен ли запрос на перенос с целевой ветвью. Ближайшая вещь для этого, кажется, является атрибутом "mergeable" при запросе на перенос, но похоже, что это только указывает, будет ли выполнено безопасное автоматическое слияние CAN, а не то, что ветка уже обновлена.

Есть ли прямой тег API json, на который можно смотреть? Если нет, есть ли простой способ проверить это вручную с помощью команд git?

Ответ 1

Существует современный способ сделать это

git merge-base --is-ancestor A B

см. git-merge-base

Ответ 2

Я не знаю, предоставляет ли GitHub эту информацию через их API, но вы можете обнаружить это вручную с помощью команд Git. Вы хотите найти так называемую базу слияния и убедиться, что этот коммит совпадает с кончиком master (или какой-либо другой основной ветвью).

В форме скрипта это будет выглядеть примерно так:

if [ $(git merge-base @ master) == $(git rev-parse master) ]
then
  echo "Your branch is up to date."
  exit 0
else
  echo "You need to merge / rebase."
  exit 1
fi

Если вы включите этот сценарий в качестве шага сборки, то значения выхода должны привести к сбою задания Jenkins, если это необходимо.

Как упоминалось в ответе Дмитрия, в более новых версиях Git вы можете использовать флаг --is-ancestor для git merge-base, чтобы упростить его до одной команды. Тогда скрипт будет выглядеть так:

if git merge-base --is-ancestor master @
then
  echo "Your branch is up to date."
  exit 0
else
  echo "You need to merge / rebase."
  exit 1
fi

Ответ 3

Это очень распространенная проблема для людей, которые хотят реализовать рабочий процесс, в котором слияния сериализуются.

Это то, что можно легко решить с помощью Mergify. Он предлагает именно то, что вам нужно, благодаря строгому рабочему процессу. Mergify берет на себя обновление вашего устаревшего запроса на получение и заказывает объединение действительных запросов на получение для вас. Мы создали Mergify, чтобы решить именно эту проблему на самом деле!

(Отказ от ответственности: я один из авторов Mergify)