X

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, 避免下述內容造成混淆.

Gitolite 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 gitolite@example.com: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 gitolite@example.com: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/user1@machine.pub # 若相同帳號, 則使用 user@machine.pub
  4. cp /tmp/user2.pub keydir/user2.pub
  5. git add keydir/user1.pub keydir/user1@machine.pub 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 gitolite@example.com:testing
  • 設定專案
    • vim conf/gitolite.conf # 增加 repo, 設定讀寫群組、使用者的權限

相關網頁

Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post