通过Gitolite你可以设置访问权限,不只作用于仓库,还可以作用到每个branch和tagname。你可以定义确切的人(或一组人)只能push特定的"refs"(或者branches或者tags)。
如果你还没离开,那接下来,我们聊聊Git的权限管理这点事儿。Git本身是不支持权限控制的,可能它也不想这么做。由于Git支持钩子(hook),因此可以在服务器端编写一系列脚本来控制Git的各种操作,达到权限控制的目的。
Gitolite只是Git权限管理工具中的一种,具有同样功能的还有:
其他肯定会有其他的解决方案,只是我觉得知道以上的就足够了。
在服务器端,使用一个unix用户作为远程访问的对象
为多用户提供访问权限,但他们不是真正的用户,不会获得shell权限
控制对多个git仓库的访问,读访问被repo层控制,写访问在branch/tag/file/directory层控制,包括谁能够rewind,create以及deletebranches/tags
能够不经过root允许进行安装,假设git和perl已经被安装了(这句话不懂,暂时直译过来)?
能够简化你的仓库路径,类似GitHub那样,例如:git@your_server.com:your-project.git
(服务端)切换到root身份
`su-root`(服务端)安装依赖
`apt-getinstallgit-coressh`(服务端)创建一个用户供Gitolite使用:
`useradd--system--shell/bin/bash--create-homegit`(服务端)设置密码
`passwdgit`(客户端)生成SSH公钥并复制到服务器的git家目录
`cd~``ssh-keygen``scp~/.ssh/id_rsa.pubgit@your_server:admin.pub`(服务端)安装Gitolite
\#如果克隆成功,说明Git服务器已经搭建完成。`gitclonegit@your_server:gitolite-admin`使用方法添加Gitolite项目成员
将项目成员通过ssh-keygen命令生成的公钥文件重命名成唯一标识的文件,如macken.pub,然后放到gitolite-admin/keydir目录下,add、commit、push之后,这样新成员就算加入了。新成员默认可以克隆任何没有被权限控制的仓库,如Gitolite自带的"testing"。
创建Gitolite项目仓库
reponew_repo
RW=macken
然后将变动提交到服务器,远程的Gitolite就会自动帮你创建好一个空仓库并分配给macken读写的权限。是不是很方便?
@admins=mackensteven
@interns=ashok
@engineers=mackenstevenwallyalice
@staff=@admins@engineers
repo@oss_repos
RWint$=@interns
RWeng-=@engineers
RWrefs/tags/rc[0-9]=@engineers
RW+=@admins
interns组只能对以“int“结尾的分支有读写权限;
engineers组可以对以“eng-“开头的分支以及该仓库的“rc[0-9]“的标签分支有读写权限;
admins组则对本仓库所有的分支有读写权限,而且“+”代表可以有强推的权限。