使用预提交挂钩停止特定作者的git提交

时间:2012-03-09 00:26:09

标签: git hook pre-commit

我的计划是使用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

2 个答案:

答案 0 :(得分:11)

当前版本的Git没有通过环境变量,命令行参数或stdin使Git钩子可以获得--author信息。但是,您可以指示用户设置--authorGIT_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_IDENTgit commit会像--author那样使用它们。

不幸的是,设置这些变量比使用--author要方便得多。我建议在启动pre-commit挂钩之前联系Git开发人员并请求他们设置这些环境变量(使用通过{{1}}传递的值)。

答案 1 :(得分:0)

我使用了以下内容,将其添加到系统.bashrc。

它不会抓住那些真正su to root并生活在那个shell中的人,(糟糕!) 但是当民间使用sudo时,它确实使我的日志变得有用。 我也试图用git保留一个/ etc changelog - 所以我可以看到每个月都做了什么。

#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-repository-and-committing-as-root