Да, в зависимости от того, как размещен ваш центральный репозиторий. Если он размещен на чем-то вроде GitHub или GitLab.com, это, вероятно, будет невозможно, поскольку провайдеры такого типа не позволяют вам предоставлять свой собственный код для проверки push-сообщений (вы можете настроить некоторые ограничения через их веб-интерфейс, но я не я думаю, что то, что ты хочешь, возможно там).
Для собственного размещения репозитория вы можете сделать это с помощью update
hook (см. Документацию для hooks ). Вот пример, который я на самом деле не проверял:
#!/bin/sh
if [ "$1" = "refs/heads/development" -a "$(git rev-list $3..master)" ]; then
echo "ERROR: master is not merged into development, please try again" >&2
exit 1
fi
По сути, это проверяет, что «ничего не осталось», если вы вычесть набор коммитов из нового состояния development
из набора коммитов на master
. Если вы объединились, development
будет иметь все коммиты master
, поэтому результатом будет пустой набор.
Это довольно просто, но имеет несколько незначительных недостатков:
- Если то же нажатие также обновляет
master
, проверка в этом хуке может еще не знать о новых изменениях в master
, поэтому в этом случае вы можете получить ложный отрицательный результат (незакрытые изменения, но push проходит) .
- Если последняя (и единственная) новая вещь, произошедшая на
master
, была слиянием с development
, хук выдаст ложный положительный результат, потому что master
будет иметь этот коммит слияния, в то время как development
выиграл ' т. Конечно, мы знаем, что это несущественное различие между двумя ветвями, но простая арифметика в хуке не понимает этих различий.