2014-03-18 35 views
4

我正在运行一个gitlab git服务器。如何阻止无效用户的git提交?

我的大多数用户正在运行3个版本的git中的1个。

git的1.7.1(CentOS用户)
git的1.7.9(所有人)
git的1.8.4(Mac用户)

有些用户不小心犯了,推动代码为root用户。我需要阻止这些用户的提交。

我的pre-commit钩子看起来是这样的:

#!/bin/bash 

if [[ $GIT_AUTHOR_NAME == 'root' ]] 
then 
    echo "If you commit as root, you're gonna have a bad time"; 
    echo "Set 'git config user.name' and try again"; 
    exit 1; 
fi 

这个工程作为一个1.7.9 pre-commit钩子和1.8.x的但不是1.7.1

this blog,预接收和发布接收挂钩没有任何我正在寻找的环境变量(GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, GIT_AUTHOR_DATE, GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL, GIT_COMMITTER_DATE, EMAIL)。

有什么办法可以修改这个预先提交的钩子来阻止旧版本的git上的root用户?

http://longair.net/blog/2011/04/09/missing-git-hooks-documentation/

回答

0

设置例如gitolite(应该有服务器系统的软件包),并对其进行配置,以便只有经过批准的用户才能进行推送。如果他们切换到root用户,凭据将不匹配,推送将被拒绝。它使您能够对每个人都可以访问的分支进行详细控制。

2

为什么不把检查放在预接收钩子中,即当代码即将提交到中央git存储库/服务器时,在服务器端进行认证。

#Extract commiter names here. 
commiters=$(git log --pretty=format:"%cn" $revs) #This should work in all git versions 

printf "$commiters\n" | while read name; do 
    if [[ $name == "root" ]]; then 
     echo "You are commiting as root user which I don't like. Reveal your identity!" 
     exit 1 
    fi 
done 
+0

这太好了。它有两个小问题:1.区分大小写2.如果一个提交从*根发生*,则脚本将以1退出。 – spuder

+0

您可以使其不区分大小写。这不应该是一件难事。关于你的观点#2,你不想阻止任何提交从根?因此,当你从根发现任何提交时退出。 –

+0

是的,但是有些来自root的提交已经存在于历史中。我需要阻止未来的根。 – spuder

0

您可以鼓励用户使用pre-commit钩子就在自己身边的缓解,但最终你将有权拒绝在服务器端的推动有全面执行该政策。

你可以做的一件事就是使用一个更新钩子,它会拒绝根作者提交的提交。添加到您的.git/hooks/update

git log --format="%h %an" ${2}..${3} | while read COMMIT_HASH COMMIT_AUTHOR; do 
    if [ "$COMMIT_AUTHOR" = "root" ]; then 
     echo "Updating ${1} by root is not allowed, offending commit: $COMMIT_HASH" 
     exit 1 
    fi 
done 

的片段会分析所有的旧版本和新版本的提交被推并拒绝推,如果这些提交的有根作为作者。另外,确保钩子是可执行的!

+0

$ {2} .. $ {3}是做什么用的?当我包含这些参数时,我收到错误“致命的:..:'..'is outside repository“ – spuder

+0

更新挂钩从git获取命令行参数,$ 1参数是ref更新的,$ 2是旧版本,$ 3是新版本,因此'$ 2 .. $ 3'是提交到你的服务器,从新版本(通常是新的分支)可以访问如果你启动了一个新的回购实验,你可能想要打印/回显参数以进行调试,或者检查是否有空问 – mockinterface

+0

@spuder此外,请参阅'.git/hooks'目录中的'update.sample'挂钩 - 你会发现这是一个很好的例子。 – mockinterface