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代码,所以不能使用此严格的校验方式


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