Остановите git-коммит определенного автора с помощью pre-commit hook

StackOverflow https://stackoverflow.com//questions/9627198

  •  09-12-2019
  •  | 
  •  

Вопрос

Мой план состоит в том, чтобы использовать git для отслеживания изменений в /etc, но при фиксации я хочу, чтобы человек, вносящий изменения, указывал себя в качестве автора, добавляя опцию --author в командной строке.

Поэтому я хотел бы остановить случайные коммиты от имени root.

Я попытался создать этот хук перед фиксацией, но он не работает - git var по-прежнему возвращает root, даже если я указываю автора в строке фиксации.

AUTHOR=`git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/\1/p'`
if [ "$AUTHOR" == "root <root@localhost>" ];
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 <a@localhost>"'
   exit 1
fi
exit 0
Это было полезно?

Решение

Текущая версия 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}" != "root@localhost" ] || {
    cat <<EOF >&2
Please commit under your own name and email instead of "${NAME} <${EMAIL}>":
GIT_AUTHOR_NAME="Your Name" GIT_AUTHOR_EMAIL="your@email.com" git commit
EOF
    exit 1
}

Как в --author аргумент, эти переменные окружения управляют автором фиксации.Поскольку эти переменные окружения находятся в среде Git, они также находятся в среде pre-commit крюк.И потому, что они находятся в окружении pre-commit крюк, они передаются в git var GIT_AUTHOR_IDENT который использует их как git commit делает.

К сожалению, установка этих переменных гораздо менее удобна, чем использование --author.Я предлагаю связаться с разработчиками Git и попросить их установить эти переменные окружения (используя значение, переданное через --author) перед запуском pre-commit крюк.

Другие советы

Я использовал следующее, добавив это в системы .bashrc.

Это не поймает народ, который на самом деле будет суть и жить в этой раковине, (плохо!) Но он сохраняет мои журналы полезными, когда народ просто используют sudo. Я тоже пытаюсь сохранить / etc mechelog с 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/Questions/256754/Correct-user-Names-when-tracking-etc-in-git-Reposity-Andc-committion-As-Root

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top