git help hooks
содержит документацию о крючках. Хук update
вызывается, когда Git собирается создать / переместить / удалить ссылку. Он вызывается один раз для каждой ссылки, подлежащей обновлению, и получает:
- 1-й аргумент: имя ссылки (например, refs / tags / v1.0)
- 2-й аргумент: SHA1 объекта, на который в данный момент указывает ссылка (все нули, если ссылка в данный момент не существует)
- 3-й аргумент: SHA1 объекта, где пользователь хочет, чтобы ссылка указывала на точку (все нули, если ссылка должна быть удалена).
Если ловушка завершается с ненулевым кодом выхода, git
не обновит ссылку, и пользователь получит ошибку.
Итак, чтобы решить вашу конкретную проблему, вы можете добавить следующее к вашей update
ловушке:
#!/bin/sh
log() { printf '%s\n' "$*"; }
error() { log "ERROR: $*" >&2; }
fatal() { error "$*"; exit 1; }
case $1 in
refs/tags/*)
[ "$3" != 0000000000000000000000000000000000000000 ] \
|| fatal "you're not allowed to delete tags"
[ "$2" = 0000000000000000000000000000000000000000 ] \
|| fatal "you're not allowed to move tags"
;;
esac