我想通过使用服务器端挂钩(更新挂钩)来阻止用户删除远程git分支。
我已经在update hook中编写了shell脚本来实现这一点 现在我可以阻止所有用户删除远程git分支,但我想给特定用户授予删除权限,为此我们需要获取用户信息(用户名) ,useremail)谁在服务器端钩子中尝试删除操作?
我们有 $USER, $GIT_AUTHOR_NAME, $GIT_AUTHOR_EMAIL
等变量来获取客户端挂钩中的用户信息,但它们在服务器端挂钩中没用。
我们是否有其他选项可以在服务器端挂钩中获取用户信息?
答案 0 :(得分:4)
SELECT TIMEDIFF(last_time, cast( now() as time)) as diff
强> 请记住,每个人都可以在提交中伪造电子邮件:
Sample hook code
要避免它访问您的中央存档文档并阅读回合用户权限(在每个服务器之间有所不同),并从那里提取有关如何获取用户详细信息的信息。
git commit -c user.name ... -c user.email ...
答案 1 :(得分:1)
答案 2 :(得分:0)
在服务器端,您可以获取正在尝试用/usr/bin/php /home/user/public_html/'the subdomain name'/cron.php
推送的commit
也就是说,它具有HEADER,可为您提供此类信息。可能是错误的或我被篡改了,但这在服务器端可用。
类似的事情会做。在下面的代码中,请注意三个相关变量: $ CATAUTHOREMAIL , $ CATAUTHOR 和 $ CATEMAIL 。
git cat-file commit SHA
这非常有用。我写这个答案的灵感来自@codewizard,因为那里仅适用于客户端,而不适用于服务器端。而且我需要服务器端的“东西”。它不是万无一失的,但是非常有用。
如果您分析提交标头,则可以获取更多信息;例如,您还具有不一定是提交作者的“提交者名称”。
上面代码中的循环将在所有提交上迭代。您可能只想获取最后(最近)提交的作者,就像代码与该# --- 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"
一样,或者您可能想要将所有它们保存在数组或其他内容中。您可以根据自己的需要更改此模板。
我使用了if [ -z "$CATAUTHOREMAIL ]
,但是如果在非常提交的消息中出现 author 一词,它就会中断...因此,您可能希望找到一个更好的过滤器,例如,将标题与提交主体分开;即第一行空白。