共计 9546 个字符,预计需要花费 24 分钟才能阅读完成。
公司代码库用 Git,全部用 SSH 认证,多个代码库多个用户,权限管理是个头疼的问题,今天终于有空测试下 Gitolite,
Gitolite 是在 Git 之上的一个授权层,依托 sshd
或者 httpd
来进行认证。(概括:认证是确定用户是谁,授权是决定该用户是否被允许做他想做的事情)。
Gitolite 允许你定义访问许可而不只作用于仓库,而同样于仓库中的每个 branch 和 tag name。你可以定义确切的人 (或一组人) 只能 push 特定的 ”refs”(或者 branches 或者 tags)而不是其他人。
测试环境:
【Gitolite 服务器】git 代码库和 Gitolite 是同一台服务器。
【管理端】管理员管理 Gitolite
【客户端】Git 代码库使用者
安装 Gitolite
首先各服务器都要安装 git 环境,
1 2 | Ubuntu: apt-get install git-core 或 apt-get install git CentOS: yum install git |
Gitolite 服务器
1 2 3 4 | 建 gituser 帐号,源代码仓库放在服务器的普通帐号下 root@gitserver # adduser --system --shell /bin/bash --group gituser root@gitserver # passwd gituser 用户 gituser 设定密码,在 SSH 公钥建立后可以把这个密码禁掉 |
管理端生成密钥
1 2 3 4 5 6 7 8 9 10 11 12 13 | root@server # adduser gitadmin root@server # passwd gitadmin root@server #su - gitadmin gitadmin@server~$ ssh -keygen -t rsa 这样就生成 gitadmin 的密钥 我们将 gitadmin 下的密钥拷贝到 Gitolite 的 gituser 用户下 gitadmin@server~$ ssh -copy- id -i ~/. ssh /id_rsa .pub gituser@192.168.1.50 第一次传输要输入 gituser 的密码即可。 当然这里只是两台机子做 SSH 无密码登录验证,也没啥难的。 确认是否成功, gitadmin@server~$ ssh gituser@192.168.1.50 这样就无密码登录到了 Gitolite 服务器上 gituser@gitserver~$ mv . ssh /authorized_keys gitadmin.pub 把之前传过来密钥做个标记 |
安装 Gitolite
在 Gitolite 服务器上操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | gituser@server~$ git clone https: //github .com /sitaramc/gitolite .git # 下载源码 gituser@server~$ mkdir bin gituser@server~$ ls bin gitolite gitadmin.pub gituser@server~$ . /gitolite/install -to /home/gituser/bin/ gituser@server~$ cd bin/ gituser@server~$ ls commands gitolite gitolite-shell lib syntactic-sugar triggers VERSION VREF 这样我们就在 gitolite 安装好了,下面生成 gitadmin.pub 的管理 git 库 gituser@ubuntu:~ /bin $ gl-setup -q ~ /gitadmin .pub creating gitolite-admin... Initialized empty Git repository in /home/gituser/repositories/gitolite-admin .git/ creating testing... Initialized empty Git repository in /home/gituser/repositories/testing .git/ [master (root-commit) 74ddb16] start 2 files changed, 6 insertions(+) create mode 100644 conf /gitolite .conf create mode 100644 keydir /sunny .pub 可以看出会有两个默认 git 项目库 gitolite-admin、testing 执行 gl-setup 时几点注意: gl-setup 要放到 $PATH,请确定~ /bin 已放在 PATH 变量,如没有,请编辑~/.bashrc,最后面添加 PATH=~ /bin :$PATH 并执行以下命令生效: sh ~/.bashrc |
Gitolite 的管理及权限设定
gitolite 的管理,包括用户管理和代码库管理,都是通过操作一个指定名称的库来实现:gitolite-admin 仓库。因此 gitolite 的管理员 sunny 需要先把这个库抓到本地,进行必要的配置后,再 push 到 remote 服务器,让设定生效
管理端服务器
抓取 gitolite-admin 仓库到本地
1 2 3 4 5 6 7 8 9 10 11 12 13 | [gitadmin@server tmp]$ git clone gituser@192.168.1.50:gitolite-admin Initialized empty Git repository in /tmp/gitolite-admin/ .git/ remote: Counting objects: 6, done . remote: Compressing objects: 100% (4 /4 ), done . remote: Total 6 (delta 0), reused 0 (delta 0) Receiving objects: 100% (6 /6 ), done . You have mail in /var/spool/mail/root [gitadmin@servertmp]$ cd gitolite-admin/ [gitadmin@server gitolite-admin]$ ls conf keydir conf 配置项目与权限的 keydir ssh 密钥所在目录 |
Gitolite 配置管理
新增加用户 增加 testuserGIT 库有访问权限
GIT 客户端 testuser 产生密钥传给管理服务器
1 2 3 4 | [root@apdn2 ~] # su testuser [testuser@apdn2 ~]$ ssh -keygen -t rsa id_rsa id_rsa.pub 将 id_rsa.pub 传给管理服务器的 gitolite-admin /keydir 目录下命名为 testuser.pub |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | 进入到管理端 [gitadmin@server gitolite-admin]$ ls conf keydir [gitadmin@server gitolite-admin]$ cd keydir/ [gitadmin@server keydir]$ ls gitadmin.pub testuser.pub [gitadmin@server keydir]$ cd .. [gitadmin@server gitolite-admin]$ git add . [gitadmin@serverg gitolite-admin]$ git commit -m "add testuser pubkey" [master 7fd7da1] add testuser pubkey Committer: sunny <sunny@apdn1.(none)> Your name and email address were configured automatically based on your username and hostname . Please check that they are accurate. You can suppress this message by setting them explicitly: git config --global user.name "Your Name" git config --global user.email you@example.com If the identity used for this commit is wrong, you can fix it with: git commit --amend --author= 'Your Name <you@example.com>' 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 keydir /testuser .pub [gitadmin@serverg gitolite-admin]$ git push Counting objects: 6, done . Delta compression using up to 4 threads. Compressing objects: 100% (4 /4 ), done . Writing objects: 100% (4 /4 ), 681 bytes, done . Total 4 (delta 0), reused 0 (delta 0) remote: remote: ***** WARNING ***** remote: the following users (pubkey files in parens) do not appear in the config file : remote: testuser(testuser.pub) To gituser@192.168.1.50:gitolite-admin 74ddb16..7fd7da1 master -> master 这样就给 testuser 添加了 SSH 认证,不过 testuser 只能访问系统自带的 testing 库外,操作不了其他的�� |
2.配置 代码库权限
Gitolite 服务器
现在要在 gitserver 新建一个代码仓 proj_a,依然是对 gitolite-admin 进行配置
编辑 gitolite-admin/conf/gitolite.conf,仿照以后的库的格式,添加:
1 2 3 4 5 6 7 8 9 10 11 | [gitadmin@serverg gitolite-admin]$ cd conf/ [gitadmin@serverg gitolite-admin]$ cat gitolite.conf repo gitolite-admin RW+ = gitadmin repo testing RW+ = @all repo proj_a # 这里设定是新增库的名称 RW+ = gitadmin # R 是读权限,W 是写权限,+ 是包括“强制更新一个分支,删除分支和更新一个 Tag”的权限 RW = testuser # 设定 RW 权限的人 |
执行 add, commmit, push 进行推送,即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | [gitadmin@serverg gitolite-admin]$ git add . [gitadmin@serverg gitolite-admin]$ git commit -m "add a new repo" [master a0f9f26] add a new repo Committer: sunny <sunny@apdn1.(none)> Your name and email address were configured automatically based on your username and hostname . Please check that they are accurate. You can suppress this message by setting them explicitly: git config --global user.name "Your Name" git config --global user.email you@example.com If the identity used for this commit is wrong, you can fix it with: git commit --amend --author= 'Your Name <you@example.com>' 1 files changed, 7 insertions(+), 0 deletions(-) [gitadmin@serverg gitolite-admin]$ git push Counting objects: 7, done . Delta compression using up to 4 threads. Compressing objects: 100% (3 /3 ), done . Writing objects: 100% (4 /4 ), 395 bytes, done . Total 4 (delta 0), reused 0 (delta 0) remote: creating proj_a... remote: Initialized empty Git repository in /home/gituser/repositories/proj_a .git/ To gituser@192.168.1.50:gitolite-admin 7fd7da1..a0f9f26 master -> master [gitadmin@serverg gitolite-admin]$git push |
gitolite.conf 的格式其实有相当多的复杂配置(详情请看官方手册),一般来说,象以下这样的,已够几个人的开放型小团队使用,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @proj_a = sunny jacob # @proj_a 是分组命名,分组用 @表示,可以在后面引用分组 @proj_b = sunny taylor jean # 如果有多个用户,用空格隔开 @admins = sunny @qa = elapse flora @engineers = sunny jacob taylor jean @staff = @admins @qa @engineers # 分组可以被引用 repo gitolite-admin # 这个是 gitolite 的管理仓库,sunny 是指定可以对其进行操作的管理员 RW+ = sunny repo proj_a RW+ = @admins RW = @proj_a elapse repo proj_b RW+ = sunny RW = @engineers flora R refs /tags/ = @qa # 这里设定的,是 QA 这个组,对 refs/tags/ 开头的路径的文件只有读权限 repo testing RW+ = @stall |
gitolite.conf 语法说明
repo 语法
- repo 语法: < 权限 > [零个或多个正规表示式批配的引用] = <user> [<user> …]
- 每条指令必须指定一个权限, 权限可以用下面任何一个权限的关键字: C, R, RW, RW+, RWC, RW+C, RWD, RW+D, RWCD, RW+CD
- C : 建立
- R : 读取
- RW : 读取 + 写入
- RW+ : 读取 + 写入 + 对 rewind 的 commit 做强制 Push
- RWC : 授权指令定义 regex (regex 定义的 branch、tag 等), 才可以使用此授权指令.
- RW+C : 同上, C 是允许建立和 regex 配对的引用(branch、tag 等)
- RWD : 授权指令中定义 regex (regex 定义的 branch、tag 等), 才可以使用此授权指令.
- RW+D : 同上, D 是允许删除和 regex 配对的引用(branch、tag 等)
- RWCD : 授权指令中定义 regex (regex 定义的 branch、tag 等), 才可以使用此授权指令.
- RW+CD : C 是允许建立和 regex 配对的引用(branch、tag 等), D 是允许删除和 regex 配对的引用(branch、tag 等)
- – : 此设定为不能写入, 但是可以读取
- 注: 若 regex 不是以 refs/ 开头, 会自动于前面加上 refs/heads/
3.删除用户
管理员在本地,删除了 gitolite-admin/keydir 目录下对应的用户 pubkey,然后执行 git 的 rm 操作, 再 commit, push 推送,即可
1 2 3 4 | [gitadmin@serverg gitolite-admin]$ rm -f keydir /jacob .pub [gitadmin@serverg gitolite-admin]$ git rm keydir /jacob .pub [gitadmin@serverg gitolite-admin]$ git commit -m "delete a user" [gitadmin@serverg gitolite-admin]$ git push |
4.删除代码库
如要删除 proj_a 代码库,管理员要分两步走:
本地编辑 gitolite-admin/conf/gitolite.conf,删除相关的 repo proj_a 代码,然后 add, commit, push 推送
1 2 3 | [gitadmin@serverg gitolite-admin]$ git add . [gitadmin@serverg gitolite-admin]$ git commit -m "remove a repo" [gitadmin@serverg gitolite-admin]$ git push |
用 gituser 帐号或 root 帐号进入 gitserver 服务器,把 gituser/repositories 下相关的 repo 目录删除
1 | root@server: /home/gituser/repositories $ rm -Rf proj_a.git # 库对应 proj_a 的目录,带.git 结尾 |
5.修改代码库的名字
改名,也是分两步,和上面执行删除的顺序反过来,
先用 gituser 帐号或 root 帐号进入 gitserver 服务器,cd repositories,执行移动
1 | root@server: /home/gituser/repositories $ mv proj_a.git proj_b.git |
回到管理端,修改 conf/gitolite.conf,把 old-name 的地方修改为 new-name,然后 add, commit 并 push
1 2 3 | [gitadmin@serverg gitolite-admin]$ git add . [gitadmin@serverg gitolite-admin]$ git commit -m "rename a repo" [gitadmin@serverg gitolite-admin]$ git push |
6.普通用户签出操作
例如 jacob 要把代码库 checkout 出来,本地修改,然后再和 remote 库的代码进行版本合并。这些操作是纯粹的 git 操作了,团队的日常开发流程,正是这样子开展。把 remote 库抓取下来,然后才开始修改
1 2 3 | jacob@client:~$ git clone gituser@server:proj_a # 项目默认放到 proj_a 目录 或 jacob@client:~$ git clone gituser@server:proj_a my_proj_a # 项目被下载到 my_proj_a 目录下 |
jacob 本地已有一个现成的项目 proj_a 正在开发,并用 git 在管理着,现在想 share 到这个项目到 proj_a
1 2 | jacob@client:~$ cd proj_a jacob@client:~ /proj_a $ git push --all gituser@myserver:proj_a # 推送到 remote server |
7. 列出本人拥有权限的库
使用普通用户 gituser 的帐号尝试登录 remote 服务器即可,
1 2 3 4 5 6 7 | [testuser@apdn2 proj_a]$ ssh gituser@192.168.1.50 PTY allocation request failed on channel 0 hello testuser, this is gitolite 2.2-1 (Debian) running on git 1.7.9.5 the gitolite config gives you the following access: R W proj_a @R_ @W_ testing Connection to 192.168.1.50 closed. |
Gitolite 管理 git server 代码库权限基本就介绍这么多,后期测试不同服务器之间 git 代码库的导入和备份。请继续关注。
Git / Gitolite 的应用学习 http://www.linuxidc.com/Linux/2015-02/113441.htm
使用 Gitolite 搭建 Git 服务器 http://www.linuxidc.com/Linux/2014-06/103004.htm
基于 Gitolite 的 Git 服务架设 http://www.linuxidc.com/Linux/2014-02/96991.htm
Fedora 通过 Http Proxy 下载 Git http://www.linuxidc.com/Linux/2009-12/23170.htm
在 Ubuntu Server 上安装 Git http://www.linuxidc.com/Linux/2009-06/20421.htm
服务器端 Git 仓库的创建(Ubuntu)http://www.linuxidc.com/Linux/2011-02/32542.htm
Linux 下 Git 简单使用教程(以 Android 为例)http://www.linuxidc.com/Linux/2010-11/29883.htm
Git 权威指南 PDF 高清中文版 http://www.linuxidc.com/Linux/2013-10/91053.htm
更多 Ubuntu 相关信息见Ubuntu 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=2
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-10/124252.htm