阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Ubuntu Gitolite管理Git Server代码库权限

494次阅读
没有评论

共计 9546 个字符,预计需要花费 24 分钟才能阅读完成。

公司代码库用 Git,全部用 SSH 认证,多个代码库多个用户,权限管理是个头疼的问题,今天终于有空测试下 Gitolite,

Gitolite 是在 Git 之上的一个授权层,依托 sshd 或者 httpd 来进行认证。(概括:认证是确定用户是谁,授权是决定该用户是否被允许做他想做的事情)。

Gitolite 允许你定义访问许可而不只作用于仓库,而同样于仓库中的每个 branch 和 tag name。你可以定义确切的人 (或一组人) 只能 push 特定的 ”refs”(或者 branches 或者 tags)而不是其他人。

测试环境:

 Ubuntu Gitolite 管理 Git Server 代码库权限

【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 配置管理

  1. 新增加用户 增加 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/repositoriesrm -Rf proj_a.git  # 库对应 proj_a 的目录,带.git 结尾

5.修改代码库的名字

改名,也是分两步,和上面执行删除的顺序反过来,

先用 gituser 帐号或 root 帐号进入 gitserver 服务器,cd repositories,执行移动

1
root@server:/home/gituser/repositoriesmv 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

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计9546字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7960817
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...
零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face免费服务器+Docker 快速部署HertzBeat 监控平台

零成本上线!用 Hugging Face 免费服务器 +Docker 快速部署 HertzBeat 监控平台 ...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装Black群晖DSM7.2系统安装教程(在Vmware虚拟机中、实体机均可)!

安装 Black 群晖 DSM7.2 系统安装教程(在 Vmware 虚拟机中、实体机均可)! 前言 大家好,...
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

颠覆 AI 开发效率!开源工具一站式管控 30+大模型ApiKey,秘钥付费+负载均衡全搞定

  颠覆 AI 开发效率!开源工具一站式管控 30+ 大模型 ApiKey,秘钥付费 + 负载均衡全...