使用git我们有这样一个场景:
master分支不允许开发人员提交,只允许负责人提交
develop分支允许开发人员提交
git没有做权限控制,这样的权限分配怎么实现呢?这里就要提到gitolite了。
create user git and create ssh-key
1 | > useradd git |
install gitolite
1 | > su - git |
gitolite管理员配置
添加用户
1 | > cd ~ |
版本库及权限管理
一个范例:
1 | 下面我们看一个不那么简单的授权文件: |
- 在上面的示例中,我们演示了很多授权指令。
- 第1行,定义了用户组 @admin,包含两个用户 jiangxin 和 wangsheng。
- 第3-4行,定义了版本库 gitolite-admin。并指定只有用户 jiangxin 才能够访问,并拥有读(R)写(W)和强制更新(+)的权限。
- 第6行,通过正则表达式定义了一组版本库,即在 ossxp/ 目录下的所有版本库。
- 第7行,用户组 @admin 中的用户,可以在 ossxp/ 目录下创建版本库。创建版本库的用户,具有对版本库操作的所有权限。
- 第8行,所有用户都可以读写 ossxp 目录下的版本库,但不能强制更新。
- 第9行开始,定义的 testing 版本库授权使用了引用授权语法。
- 第11行,用户组 @admin 对所有的分支和里程碑拥有读写、重置、添加和删除的授权。
- 第12行,用户 junio 可以读写 master 分支。(还包括名字以 master 开头的其他分支,如果有的话)。
- 第13行,用户 junio 可以读写、强制更新、创建以及删除 pu 开头的分支。
- 第14行,用户 pasky 可以读写 cogito 分支。 (仅此分支,精确匹配)。
踩过的坑
当我们搭建好gitolite后,是需要添加用户进去,但是如果我们不添加用户,直接把.pub文件内容放到git的.ssh/authorized_keys里面。如:
1 | > ssh-copy-id [-p 22898] git@gitserver |
此时也能直接免密码使用gitolite版本库repositories中的仓库。
我们git clone命令将会是这样的:1
2> #假设repositiories目录所在地位:/home/git/repositories
> git clone ssh://git@gitserver:/home/git/repositories/testing.git
这样是能正常克隆项目下来,但是当执行push操作的时候,会报如下错误:
1 | [root@izwz994ghq89x8naebwhg1z gitolite-admin]# git push origin master |
这个问题在网上很少有人解决了。在此记录一下解决方法
注意事项:
- 当添加用户后,gitolite会自动在创建者(如git)的主目录下的.ssh/authorized_keys里面,添加如下一段代码:
1
2
3
4# gitolite start
command="/home/git/bin/gitolite-shell git",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYz9J0faTZljmvBqJLcYkQKQ4o6RqdmMBitqrwcq6Q2yEy+7eTZe9znw9Ck58lqWGSSBSJtntnxIpTW2dH8bxmyjTwap/HVkyJb+B/WYMh7IsNuldlZPHNUzD1v8KfrmZ121jrIs+8BL3g+G18sUy7dfvtNx0gBZxHN7zBetMvtL9uH6YIZVcZKu4NKBFT8Y+cOmZJH0/9K5yyI4ZKnqfBzUo5Iyp+j8m25GNoMeYZVa1Uc8YfPtJhPeuzyDPbipd82FNeJ6TOHOQGhVsaGGtOny/5wQsTOrr+J3+FojtbUkDcQijxunFXImChze9Y+gQ80zSJZsSOL3vOnXiLb6cp git@localhost.localdomain
command="/home/git/bin/gitolite-shell jay",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC2Iw4uv8l+WCRX47GzJOCzR9ZkppvqfhPaRSfIaDxC5cSukJ7zZ7oNwl+WPX6rDIBlO7KBBsZzXzWDB46H3VzM484/OSK3tRDaWFgQYwcBDtxtl0DkvMl9eitOiLTqacc9WMjyAiNsXj4iklul2GU3bw/aIdinMKNKcwJPsPenVElVhLyynVumKDnlJ0Hz8CfiMbbJazb/BIzrD7aISLwVBzibjbb9n2Oryc6n8VlNmsxSbUVSC+/LU46sfNT54z2SgYE6gysEOr8tVG6mjzF7tIzAnptbeeqFiTv1hJ78JK5AYoMmh38Ronf7t2GqYAm+TgxMLDi8ggbxDuTpndcP jay@jay-PC
# gitolite end - 只有添加到gitolite的用户才能实施权限的配置
- 添加到gitolite的用户,可以是用简约的远端目录地址,如:
1
2
3
4
5> # 原来的ssh://的完整地址
> git clone ssh://git@gitserver:/home/git/repositories/testing.git
> # 简约地址
> git clone git@gitserver:testing.git
> # 其实就是用户添加进去了,访问的时候就会把repositories当作默认目录
分析原因:
出现此错误,主要是我们的没有把自己添加用户到gitolite-admin/keydir里面,而remote远端地址使用完整目录home/git/repositories/gitolite-admin.git,导致hook脚本执行的时候找不到环境路径
解决方法:
把你添加到gitolite用户里面,修改远端地址为简约地址
步骤如下:
1 | > #本地生成id_rsa.pub文件 |
解决完毕
小技巧
使用git配置的host方式
当如果我们的git服务器不是以22为默认端口,此时远端地址必须带上端口号,如:
ssh协议的远端地址:1
> git clone ssh://git@gitserver:22898/home/git/repositories/testing.git
如果使用gitolite简约地址,是无法识别端口号的,错误示例如下:1
> git clone git@gitserver:22898:testing.git
解决此问题可以使用git的host方式, 步骤:
首先,配置~/.ssh/config1
2
3
4
5
6
7> su - git
> vim ~/.ssh/config
> #内容如下
> host gtls
> hostname localhost
> port 22898
> wq
修改remote url:1
2
3> cd ~/gitolite-admin
> git remote set-url origin git@gtls:gitolite-admin.git
> git push origin master
gitolite的版本库位置
当我们搭建好gitolite后,会生成repositories目录,此目录是gitolite可以管控的仓库目录,目前我为发现可以修改此目录的方法。所以我们只能把所用开发仓库都放在此目录下进行管控,但是如果我们已经有gitcode目录了,移动过去也不方便,会导致开发人员修改本地的远端地址,麻烦。
此时我们可以使用linux的软链接来帮助我们。
1 | > # 假设我们有项目仓库地址:/data/gitcode/test.git |