#!/bin/bash
while read oldrev newrev refname
do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [ "$branch" = "main" ]; then
echo "Push в ветку main запрещен. Используйте pull request." >&2
exit 1
fi
done
Убедитесь, что файл `pre-receive` имеет права на исполнение: `chmod +x .git/hooks/pre-receive`.
Запретить push в ветку main
с помощью хука можно, используя хук pre-receive
на стороне сервера (репозитория). Вот как это сделать:
Подключитесь к серверу, где расположен ваш Git репозиторий. Вам понадобится доступ к директории .git
репозитория.
Перейдите в директорию .git/hooks
. Если директории hooks
не существует, создайте её.
cd .git/hooks
Создайте файл pre-receive
. Если он уже существует, убедитесь, что он исполняемый.
touch pre-receive
chmod +x pre-receive
Добавьте следующий скрипт в файл pre-receive
:
#!/bin/bash
while read oldrev newrev refname; do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [[ "$branch" == "main" ]]; then
echo "Push в ветку main запрещен!"
exit 1
fi
done
exit 0
Разберем скрипт:
#!/bin/bash
: Указывает, что это bash скрипт.while read oldrev newrev refname
: Читает стандартный ввод, предоставляемый Git. Для каждой ветки, в которую происходит push, он получает старый ревизионный номер (oldrev
), новый ревизионный номер (newrev
) и полное имя ссылки (refname
).branch=$(git rev-parse --symbolic --abbrev-ref $refname)
: Извлекает имя ветки из refname
. Например, если refname
равно refs/heads/main
, то branch
станет main
.if [[ "$branch" == "main" ]]
: Проверяет, является ли имя ветки main
.echo "Push в ветку main запрещен!"
: Если имя ветки main
, выводит сообщение об ошибке.exit 1
: Выход из скрипта с кодом 1
, что сигнализирует Git о том, что push должен быть отклонен.exit 0
: Выход из скрипта с кодом 0
, что означает, что push разрешен.Сделайте файл pre-receive
исполняемым. Это необходимо для того, чтобы Git мог его выполнить.
chmod +x pre-receive
Альтернативные подходы:
Важно: Хуки выполняются на сервере. Клиент не может обойти эти правила. Все push-операции, которые пытаются внести изменения в ветку main
, будут отклонены сервером.