Есть ли способ настроить хранилище git для отклонения 'git push -force'?

Мне было интересно, есть ли способ предотвратить "git push --force" в репозитории (только на главной ветке)?

Предположим, у меня есть удаленный репозиторий git и выполните:

  • 'git push' в 'master'. Он работает.
  • 'git push --force' в 'branch-1'. Он работает.
  • 'git push --force' в 'master'. Он отклоняется.

Возможно ли это?

Спасибо за любые ответы и предложения.

BR, Dawid.

Ответ 1

Настройка переменных конфигурации:

receive.denyNonFastForwards
receive.denyDeletes

предотвратит работу любых "принудительных" нажатий на всех ветвях.

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

Существует примерный крюк обновления, называемый "update-paranoid", который, вероятно, делает то, что вам нужно (и больше) в дистрибутиве git в папке "contrib".

ссылка gitweb

Ответ 2

Я написал этот быстрый крюк обновления, чтобы предотвратить непереходные обновления (push) в ветке "dev" в репозитории:

#!/bin/sh

REFNAME=$1
OLDSHA=$2
NEWSHA=$3

if [ "refs/heads/dev" != $REFNAME ]; then
  exit 0
fi

MERGEBASE=$(git merge-base $OLDSHA $NEWSHA)
if [ $OLDSHA = $MERGEBASE ]; then
  exit 0
fi

echo "Not a fast-forward on branch dev"
exit 1