Linux 使用 Gitolite 架设 Git Server

单纯使用 SSH 架设可见此篇: Linux 架设使用 SSH 共享存取的 Git Server

想要控管 User / Project 权限, 而且还想要控管 branch / tag 等读写权限, 则需要靠 Gitolite 等套件来协助.

  • gitolite – SSH-based gatekeeper for git repositories

此篇主要写的是 Gitolite 架设, 若之前已经有依照上述文章架设共享存取的 Git Server, 而 Gitolite 也想用 git 的帐号来管理, 则需做下述动作先改回原始设定.

注: 此文会用 gitolite 的帐号来管理, 不会用 git 帐号, 所以不需要做下述更改的动作

  1. vim /etc/passwd

    git:x:1000:1000::/home/git:/usr/bin/git-shell
    改回
    git:x:1000:1000::/home/git:/bin/sh

  2. mv /home/git/.ssh/authorized_keys /home/git/.ssh/authorized_keys.bak

相关资料准备

  • 系统: Debian / Ubuntu Linux
  • Server: example.com
  • Project name: project_name
  • Gitosis (Git) Repository 位置: /var/lib/gitolite/repositories # Debian / Ubuntu Linux 套件默认位置
  • Group name: myteam

系统套件安装

  • apt-get install gitolite git-core
  • 安装完成会出现此讯息: No adminkey given – not initializing gitolite in /var/lib/gitolite.
  • 相关设定参考可见 /etc/gitolite/example.conf, /etc/gitolite/example.gitolite.rc

产生 SSH 公钥

  1. ssh-keygen -t rsa # 产生 id_rsa, id_rsa.pub
  2. mv id_rsa ~/.ssh/ # 将 id_rsa 放在 ~/.ssh/ 内.
  3. scp id_rsa.pub example.com:/tmp/user1.pub # 将 id_rsa.pub 丢到 Server 上, 大家的 public key 都需要传到 Server 上.
  4. scp id_rsa.pub example.com:/tmp/admin.pub # 管理者的 key 同 user key, 在此设为 admin.pub, 避免下述内容造成混淆.

Gitosis Server 架设

  1. ssh example.com # Git Server
  2. sudo su – gitolite
  3. gl-setup /tmp/admin.pub # 汇入管理者的 Public key. 注意: 此档名即是帐号名称, 不要使用 id_rsa.pub 当档名, 建议用 "帐号.pub" 当档名
  4. exit

Gitolite Server 设定专案、新增帐号

  1. Gitolite 的专案权限 / 帐号管理 是使用 Git 来管理, 专案名称: gitolite-admin.git
  2. git clone [email protected]:gitolite-admin # 因为 Gitolite 是用 gitolite-admin.git 来管理, 所以需要抓下来修改、设定(未来所有管理也是如此)
  3. cd gitolite-admin # 会看到下述
    • conf/gitolite.conf # 设定档, 设定谁可以读写哪个专案的 Repository
    • keydir # 目录, 放每个帐号的 public key. 放置的档案命名: user1.pub, user2.pub (user1, user2.. 为帐号名称(档名 = 帐号), 建议使用 "帐号.pub" 当档名)

设定专案权限

  1. cd gitolite-admin
  2. vim conf/gitolite.conf # 会看到下述, 不要动他, 于最下方设定自己的 Group / 专案名称即可.

    repo    gitolite-admin
     RW+     =   admin
    repo    testing
     RW+     =   @all

  3. 由此档案 新增 / 修改后, commit + push 即可.

建立专案

  1. git clone [email protected]:testing # 对应 gitolite.conf 的 repo testing, 会出现下述讯息

    Cloning into testing…
    warning: You appear to have cloned an empty repository.

  2. cd testing
  3. touch readme
  4. git add .
  5. git commit -m ‘add readme’
  6. git push origin master

新增帐号

  1. cd gitolite-admin
  2. cp /tmp/user1.pub keydir/user1.pub # 请依照实际帐号命名, 不要取 user1, user2
  3. cp /tmp/user1.pub keydir/[email protected] # 若相同帐号, 则使用 [email protected]
  4. cp /tmp/user2.pub keydir/user2.pub
  5. git add keydir/user1.pub keydir/[email protected] keydir/user2.pub
  6. git commit -m ‘add user1, user1@machine, user2 public key’
  7. git push

gitolite.conf 更多设定条件

下述摘录自: Gitolite 构建 Git 服务器 – 授权使用者建立属于自己的空间 (User 下面可以建 N 个 Repository), 在此就不记载, 请自行详见: 此文的 章节 2.4.3

# 取自 2.3.1 授权文件基本语法
@admin = jiangxin wangsheng

repo gitolite-admin
 RW+    = jiangxin

repo ossxp/.+
 C       = @admin
 RW     = @all

repo testing
 RW+                   =   @admin
 RW      master        =   junio
 RW+     pu            =   junio
 RW      cogito$        =   pasky
 RW      bw/           =   linus
 -                        =   somebody
 RW      tmp/           =   @all
 RW      refs/tags/v[0-9] =   junio

# 取自 2.3.3 ACL
repo testing
 RW+   = jiangxin @admin
 RW    = @dev @test
 R      = @all

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/
群组
  • @all 代表所有人的意思
  • @myteam user1 user2 : user1, user2 都是属于 myteam 这个群组

常用命令

下述全部都在 gitolite-admin.git 内操作

  • 新增帐号
    • cp /tmp/user1.pub keydir/user1.pub # 注意: 档名要取 "帐号.pub"
  • 新增专案
    1. vim conf/gitolite.conf # 增加 repo, 例如:

      repo testing
       RW @all

    2. git clone [email protected]:testing
  • 设定专案
    • vim conf/gitolite.conf # 增加 repo, 设定读写群组、使用者的权限

相关文档

  • Gitolite 构建 Git 服务器 – 使用 Gitolite, 推荐此篇必看

相关推荐