使用Git hook来校验push用户名的合法性
Git和CVS一个很大的不同是,它没有一个完善的权限控制系统
即使采用了Gitosis工具,它实际上是通过公钥来控制某台服务器的权限
用户在使用git前,依然需要设置user.name来控制提交时的用户名
但即使你没有设置,会有一个默认的空用户名或者是自己的登录用户名,如root
这样通过git log就很难看到对应的代码到底是哪个人员修改的了
不过,可以通过hook来初步解决这个问题
在git目录下的hooks目录里,新建一个pre-receive的hook,代码如下:
折叠复制代码
- while read old new name; do
- name=$(git log -1--pretty=format:%aN $new)
- email=$(git log -1--pretty=format:%ae $new)
- user_prefix=`echo $name | awk -F'_' '{print $1}'`
- check_user=`echo $GIT_VALID_USER | grep -c $user_prefix`
- if [ "$check_user" == "0" ]
- then
- echo "Username $name denied, please set user.name"
- exit 43
- else
- exit 0
- fi
- 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行增加如下代码:
然后在hook里校验name是否等于这个环境变量的值即可
但由于我们有一些公共的服务器,可能很多开发人员都会在上面push代码,所以不能使用此严格的校验方式
只能使用上述的有效用户名列表的验证方式