自缚绳子:使用Git hook来校验push用户名的合法性

来源:百度文库 编辑:九乡新闻网 时间:2024/04/30 00:04:31

Git和CVS一个很大的不同是,它没有一个完善的权限控制系统

即使采用了Gitosis工具,它实际上是通过公钥来控制某台服务器的权限

用户在使用git前,依然需要设置user.name来控制提交时的用户名

但即使你没有设置,会有一个默认的空用户名或者是自己的登录用户名,如root

这样通过git log就很难看到对应的代码到底是哪个人员修改的了

不过,可以通过hook来初步解决这个问题

在git目录下的hooks目录里,新建一个pre-receive的hook,代码如下:

 

折叠展开复制代码

  1. while read old new name; do

     

  2. name=$(git log -1 –pretty=format:%aN $new)

     

  3. email=$(git log -1 –pretty=format:%ae $new)

     

  4. user_prefix=`echo $name | awk -F'_' '{print $1}'`

     

  5. check_user=`echo $GIT_VALID_USER | grep -c $user_prefix`

     

  6. if [ "$check_user" == "0" ]

     

  7. then

     

  8. echo "Username $name denied, please set user.name"

     

  9. exit 43

     

  10. else

     

  11. exit 0

     

  12. fi

     

  13. done

     

 

需要在服务器上设置一个环境变量GIT_VALID_USER,保存合法的用户名列表

当用户名校验不通过,则返回一个非0的值即可

如果需要严格的用户名校验,即提交的user.name必须是gitosis里配置的对应Client的用户名

则可以在/usr/local/lib/python2.5/site-packages/gitosis-0.2-py2.5.egg/gitosis/serve.py中第202行增加如下代码:

os.environ['GIT_USER']=user

然后在hook里校验name是否等于这个环境变量的值即可

但由于我们有一些公共的服务器,可能很多开发人员都会在上面push代码,所以不能使用此严格的校验方式

只能使用上述的有效用户名列表的验证方式