Отключить удаление тега

У меня есть центральный голый репозиторий, в котором команда публикует (толкает) свои коммиты. В этом основном репозитории я хочу отключить удаление и переименование тега.

Есть ли решение вроде крючка или что-то еще?

Ответы

Ответ 1

git help hooks содержит документацию о крючках. Крючок update вызывается, когда Git собирается создать/переместить/удалить ссылку. Он вызывается один раз для каждой ссылки для обновления и дается:

  • 1-й аргумент: имя ссылки (например, refs/tags/v1.0)
  • 2-й аргумент: SHA1 объекта, в котором теперь указывает ссылка (все нули, если ссылка в настоящее время не существует)
  • Третий аргумент: 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