使用 pre-commit hook 停止特定作者的 git 提交

16

我计划使用Git来跟踪/etc目录下的更改,但在提交时我希望修改者可以通过在命令行上添加--author选项来指定自己为作者。

因此,我希望防止以root身份意外提交。

我尝试创建了一个pre-commit hook,但它并没有起作用——即使我在提交行上指定作者,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

1
令人惊讶的是似乎没有办法获取这些信息。我可以确认 git var GIT_AUTHOR_IDENT 显示的是原始作者,而不是通过 --author 提供的作者... - Borealid
附带地也可以访问 https://gist.github.com/tripleee/16767aa4137706fd896c - tripleee
2个回答

12

在Git的版本 v1.7.10.1之前(发布于2012-05-01),Git没有通过环境变量、命令行参数或stdin将--author信息提供给Git钩子。 但是,您可以指示用户设置GIT_AUTHOR_NAMEGIT_AUTHOR_EMAIL环境变量来替代使用--author命令行。

#!/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要麻烦得多。如果可以的话,请升级到v1.7.10.1或更高版本。


谢谢,这正是我想要的。我尝试在GIT_AUTHOR_NAME和GIT_AUTHOR_EMAIL上使用git var命令,但总是没有输出 - 这就解释了原因。 - Adrian Cornish
1
这已经不正确了,似乎适用于GIT 2.7.4(也可能是更早版本)。在“pre-commit”钩子中放置echo $GIT_AUTHOR_NAME会打印出作者的名称(无论是在git配置中设置的还是通过--author传递的名称)。此外,git var GIT_AUTHOR_IDENT似乎可以与--author一起使用。 - lumbric
看起来这个提交已经添加了支持,所以会在1.7.11及更高版本中存在。https://github.com/git/git/commit/7dfe8ad6006c105989e4e8cfb196aa4ecda3c21d - Jason Viers
那么新的方法是什么? - theonlygusti

0

我使用了下面的方法,将其添加到系统的 .bashrc 文件中。

这个方法不能捕捉那些实际上使用 su 切换到 root 并在那个 shell 中工作的人(不好!) 但是当别人只是使用 sudo 时,它确实让我的日志更有用。 我也正在尝试使用 git 来保持一个 /etc 变更日志 - 这样我可以按月份查看做了什么。

#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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接