Остановить фиксацию git конкретным автором, используя привязку до фиксации
Мой план состоит в том, чтобы использовать git для отслеживания изменений в /etc, но при совершении я хочу, чтобы человек, внесший изменения, указал себя как автора, добавив параметр --author в командной строке.
Поэтому я хотел бы остановить случайные коммиты как root.
Я попытался создать этот привязку pre-commit, но он не работает - git var все еще возвращает root, даже если я укажу автора на строке фиксации.
AUTHOR=`git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/\1/p'`
if [ "$AUTHOR" == "root <[email protected]>" ];
then
echo "Please commit under your own user name instead of \"$AUTHOR\":"
echo 'git commit --author="Adrian"'
echo "or if your name is not already in logs use full ident"
echo 'git commit --author="Adrian Cornish <[email protected]>"'
exit 1
fi
exit 0
Ответы
Ответ 1
Текущая версия Git не делает доступной --author
информацию для Git перехватчиков через переменные среды, аргументы командной строки или stdin. Однако вместо того, чтобы требовать использования командной строки --author
, вы можете указать пользователям установить переменные среды GIT_AUTHOR_NAME
и GIT_AUTHOR_EMAIL
:
#!/bin/sh
AUTHORINFO=$(git var GIT_AUTHOR_IDENT) || exit 1
NAME=$(printf '%s\n' "${AUTHORINFO}" | sed -n 's/^\(.*\) <.*$/\1/p')
EMAIL=$(printf '%s\n' "${AUTHORINFO}" | sed -n 's/^.* <\(.*\)> .*$/\1/p')
[ "${NAME}" != root ] && [ "${EMAIL}" != "[email protected]" ] || {
cat <<EOF >&2
Please commit under your own name and email instead of "${NAME} <${EMAIL}>":
GIT_AUTHOR_NAME="Your Name" GIT_AUTHOR_EMAIL="[email protected]" git commit
EOF
exit 1
}
Как и аргумент --author
, эти переменные среды управляют автором фиксации. Поскольку эти переменные среды находятся в среде Git, они также находятся в окружении pre-commit
. И поскольку они находятся в среде pre-commit
hook, они передаются в git var GIT_AUTHOR_IDENT
, который использует их как git commit
.
К сожалению, установка этих переменных намного менее удобна, чем использование --author
. Я предлагаю обратиться к разработчикам Git и запросить, чтобы они установили эти переменные среды (используя значение, переданное через --author
), перед запуском hook pre-commit
.
Ответ 2
Я использовал следующее, добавив это в системы .bashrc.
Он не поймает людей, которые на самом деле su для root и живут в этой оболочке (плохо!)
Но он сохраняет мои журналы полезными, когда народ просто использует sudo.
Я тоже пытаюсь сохранить /etc changelog с помощью git, чтобы я мог видеть, что было сделано месяц за месяцем.
#I want everyone to check in changes to /etc files, but also want their names even when they use sudo.
export GIT_COMMITTER_EMAIL=${USER}@ourcompany.co.nz
export GIT_AUTHOR_EMAIL=${USER}@ourcompany.co.nz
https://serverfault.com/info/256754/correct-user-names-when-tracking-etc-in-git-repository-and-committing-as-root