Gitolite 是在 Git 之上的一個授權層,依托 sshd 或者 httpd 來進行認證。(認證是確定用戶是誰,授權是決定該用戶是否被允許做他想做的事情)。
通過 Gitolite 你可以設置訪問權限,不只作用于倉庫,還可以作用到每個 branch 和 tag name。你可以定義確切的人(或一組人)只能 push 特定的 "refs" (或者 branches 或者 tags )。
寫在前面
如果你熟悉 Git 和 SVN 的區別,相信你不會認為 Git 服務器有多復雜。而事實上,搭建一個無需授權管理的Git服務器確實很簡單。因為這個服務器僅僅是一個遠程裸倉庫(無工作區),用來作為24小時開機的交換中心而已。如果你的需求如此簡單,推薦學習 廖雪峰 《Git 教程》中的 搭建 Git 服務器 一節。
如果你還沒離開,那接下來,我們聊聊 Git 的權限管理這點事兒。Git 本身是不支持權限控制的,可能它也不想這么做。由于 Git 支持鉤子(hook),因此可以在服務器端編寫一系列腳本來控制 Git 的各種操作,達到權限控制的目的。
服務器搭建翻墻。Gitolite 只是 Git 權限管理工具中的一種,具有同樣功能的還有:
GitLab 可以說是 GitHub 的開源版本,一開始是使用 Gitolite 作為授權管理的解決方案,后來因為兩個項目的開發和同步等方面出現問題,在2013年2月,GitLab 宣布與 Gitolite 分道揚鑣。總之,GitLab 是一個重量級的版本,要使用它,你需要安裝很多額外的軟件,如 PostgreSQL, Redis, Sidekiq, Unicorn, nginx and gitlab-shell 等。所以說,它是資源密集型的,但功能確實強大,也更有利于開發團隊的高效率協作,比較適合大型團隊。
Gitosis 和 Gitolite 沒什么區別,只是這個項目已經停止維護了,所以我也懶得去費時間進行了解,這里只是提一下。
其他 肯定會有其他的解決方案,只是我覺得知道以上的就足夠了。
簡單介紹
到現在我們也只是知道,Gitolite 是一款 Git 授權管理工具,那么它具體是怎樣的呢?我們姑且從它的幾個特性來簡單了解下:
服務器搭建ftp服務,在服務器端,使用一個 unix 用戶作為遠程訪問的對象
為多用戶提供訪問權限,但他們不是真正的用戶,不會獲得 shell 權限
控制對多個 git 倉庫的訪問,讀訪問被repo層控制,寫訪問在 branch/tag/file/directory 層控制,包括誰能夠 rewind,create 以及 delete branches/tags
能夠不經過root允許進行安裝,假設git和perl已經被安裝了 (這句話不懂,暫時直譯過來)?
認證通常采用sshd,但是也可以使用httpd
搭建自己的linux服務器?能夠簡化你的倉庫路徑,類似 GitHub 那樣,例如:git@your_server.com:your-project.git
開始搭建
-
(服務端) 切換到 root 身份
`su - root`
-
(服務端) 安裝依賴
`apt-get install git-core ssh`
-
(服務端) 創建一個用戶供 Gitolite 使用:
`useradd --system --shell /bin/bash --create-home git`
-
(服務端) 設置密碼
`passwd git`
-
搭建虛擬服務器,(客戶端) 生成 SSH 公鑰并復制到服務器的 git 家目錄
`cd ~` `ssh-keygen` `scp ~/.ssh/id_rsa.pub git@your_server:admin.pub`
-
(服務端) 安裝 Gitolite
`su - git``mkdir bin``git clone git://github.com/sitaramc/gitolite.git``~/gitolite/install -to ~/bin`\# 將你的公鑰 admin.php 設置為 Gitolite 超級管理員 `~/bin/gitolite setup -pk ~/admin.pub`
-
(客戶端) 克隆神奇的授權管理倉庫
\# 如果克隆成功,說明 Git 服務器已經搭建完成。 `git clone git@your_server:gitolite-admin`
使用方法
-
添加 Gitolite 項目成員
將項目成員通過
ssh-keygen
命令生成的公鑰文件重命名成唯一標識的文件,如macken.pub,然后放到 gitolite-admin/keydir 目錄下,add
、commit
、push
之后,這樣新成員就算加入了。新成員默認可以克隆任何沒有被權限控制的倉庫,如 Gitolite 自帶的 "testing"。 -
路由器搭建web服務器,創建 Gitolite 項目倉庫
倉庫的創建不需要你登錄服務端,只需要用編輯器打開 gitolite-admin/conf/gitolite.conf,加入兩行:
repo new_repo
RW = macken
然后將變動提交到服務器,遠程的 Gitolite 就會自動幫你創建好一個空倉庫并分配給 macken 讀寫的權限。是不是很方便?
-
git服務器。項目授權管理
-
要方便的進行授權,那就有必要將項目的成員分組:
@admins = macken steven
@interns = ashok
@engineers = macken steven wally alice
境外服務器搭建。
@staff = @admins @engineers
-
可以對倉庫的分支和標簽進行正則匹配授權:
repo @oss_repos
RW int$ = @interns
RW eng- = @engineers
自建web服務器。
RW refs/tags/rc[0-9] = @engineers
RW+ = @admins
interns 組只能對以 “int“ 結尾的分支有讀寫權限;
engineers 組可以對以 “eng-“ 開頭的分支以及該倉庫的 “rc[0-9]“ 的標簽分支有讀寫權限;
admins 組則對本倉庫所有的分支有讀寫權限,而且 “+” 代表可以有強推的權限。
git搭建。其它更詳盡的授權設置請參閱 官方文檔
-
寫在最后
Git 是極具開源精神的分布式版本控制系統,但并不意味著在 Git 基礎上加上授權控制是有什么不妥,目的不在于防著誰,而在于明確職責劃分,方便協調管理,避免因為任何人都可以接觸所有代碼而產生不必要的麻煩。就像 GitHub 那樣,任何人都可以 fork 別人的項目,從而生成一個分支到自己的倉庫,但你無法直接操作別人的 master 分支,只能由項目的創建者根據你提交的 PR 來進行 merge。這樣,才是一個有秩序的開源實踐。
最后,推薦一篇關于 Git Workflow 的經典老文:A successful Git branching model。
原文鏈接: https://macken.me/article/use...