如何在服务器端git钩子中获取推送用户信息?

如何在服务器端git钩子中获取推送用户信息?,git,githooks,Git,Githooks,我想阻止用户使用服务器端钩子(更新钩子)删除远程git分支 我已经在更新钩子中编写了shell脚本来实现这一点。 现在我可以停止所有用户删除远程git分支,但我想给特定用户授予删除权限,为此,我们需要获取用户信息(用户名、用户电子邮件),知道谁在服务器端钩子中尝试删除操作 我们有$USER、$GIT\u AUTHOR\u NAME、$GIT\u AUTHOR\u EMAIL等变量来获取客户端钩子中的用户信息,但它们在服务器端钩子中没有用处 在服务器端钩子中获取用户信息还有其他选择吗?示例钩子代码

我想阻止用户使用服务器端钩子(更新钩子)删除远程git分支

我已经在更新钩子中编写了shell脚本来实现这一点。
现在我可以停止所有用户删除远程git分支,但我想给特定用户授予删除权限,为此,我们需要获取用户信息(用户名、用户电子邮件),知道谁在服务器端钩子中尝试删除操作


我们有
$USER、$GIT\u AUTHOR\u NAME、$GIT\u AUTHOR\u EMAIL
等变量来获取客户端钩子中的用户信息,但它们在服务器端钩子中没有用处

在服务器端钩子中获取用户信息还有其他选择吗?

示例钩子代码
请记住,每个人都可以通过以下方式在提交中伪造电子邮件:

git commit -c user.name ... -c user.email ...
为了避免出现这种情况,您可以访问中央回购文档,阅读用户权限(每台服务器的权限不同),并从中提取如何获取用户详细信息的信息

#!/bin/sh
#

# Extract the desired information from the log message
# You can also use the information passed out by the central repo if its available

# %ae = Extract the user email from the last commit (author email)
USER_EMAIL=$(git log -1 --format=format:%ae HEAD)

# %an = Extract the username from the last commit (author name)
USER_NAME=$(git log -1 --format=format:%an HEAD)

# or use those values if you have them:
# $USER, $GIT_AUTHOR_NAME, $GIT_AUTHOR_EMAIL

#
#... Check the branches and whatever you want to do ...
#

# personal touch :-)
echo "                                         "
echo "                   |ZZzzz                "
echo "                   |                     "
echo "                   |                     "
echo "      |ZZzzz      /^\            |ZZzzz  "
echo "      |          |~~~|           |       "
echo "      |        |-     -|        / \      "
echo "     /^\       |[]+    |       |^^^|     "
echo "  |^^^^^^^|    |    +[]|       |   |     "
echo "  |    +[]|/\/\/\/\^/\/\/\/\/|^^^^^^^|   "
echo "  |+[]+   |~~~~~~~~~~~~~~~~~~|    +[]|   "
echo "  |       |  []   /^\   []   |+[]+   |   "
echo "  |   +[]+|  []  || ||  []   |   +[]+|   "
echo "  |[]+    |      || ||       |[]+    |   "
echo "  |_______|------------------|_______|   "
echo "                                         "
echo "                                         "

我找到了解决办法


我们正在使用bonobo git server作为版本控制。

在服务器端,您可以获得试图使用
git cat file commit SHA推送的
commit

这就是说,它有一个头,给你这样的信息。这可能是错误的,也可能是被篡改的,但这在服务器端是可用的

这样就行了。在以下代码中,请注意三个相关变量:$CATAUTHOREMAIL$CATAUTHOR$CATEMAIL

# --- Command line arguments
refname="$1"
oldrev="$2"
newrev="$3"

echo
echo '*** Checking your push update...'

MISSREVS=`git rev-list ${oldrev}..${newrev}`
CATAUTHOREMAIL=""
CMTMSG=""
for RV in ${MISSREVS} ; do
    if [ -z "$CATAUTHOREMAIL" ] ; then
        CATAUTHOREMAIL=`git cat-file commit ${RV} | grep author`
    fi  
    CMTMSG="$CMTMSG "`git cat-file commit ${RV} | sed '1,/^$/d'`
done

REMSG="author (.*) <"
[[ $CATAUTHOREMAIL =~ $REMSG ]]
CATAUTHOR="${BASH_REMATCH[1]}"
REMSG="author.*<(.*)>.*"
[[ $CATAUTHOREMAIL =~ $REMSG ]]
CATEMAIL="${BASH_REMATCH[1]}"
echo "*** Last commit author = $CATAUTHOR"
echo "*** Last commit email = $CATEMAIL"
#---命令行参数
refname=“$1”
oldrev=“$2”
newrev=“$3”
回声
回显“***正在检查推送更新…”
MISSREVS=`git rev list${oldrev}..${newrev}`
CATAUTHOREMAIL=“”
CMTMSG=“”
对于${MISSREVS}中的RV;做
如果[-z“$CATAUTHOREMAIL”];然后
CATAUTHOREMAIL=`git cat file commit${RV}| grep author`
fi
CMTMSG=“$CMTMSG”`git cat file commit${RV}|sed'1,/^$/d'`
完成

REMSG=“作者(.*)人们可以伪造电子邮件,但在执行任何操作时,他们需要发送正确的身份验证信息,如用户名。当我们删除分支时,我想我们没有日志信息来获取详细信息。$USER、$GIT\u AUTHOR\u NAME、$GIT\u AUTHOR\u email对于获取客户端钩子的详细信息很有用,而对于服务器端钩子则没有用处。您可以控制它通过将允许的协议限制为ssh来实现,这意味着服务器必须对您进行身份验证,而不管传递给服务器的值是多少,身份验证都是通过ssh密钥完成的。如何完成?取决于您的centeral repoi。我为您编写了一个示例,介绍了如何通过log命令在服务器端获取身份验证