藉助 Gitolite,你可使用 Git 來管理 Git 服務器。在咱們的系列文章中瞭解這些不爲人知的 Git 用途。html
正如我在系列文章中演示的那樣,Git 除了跟蹤源代碼外,還能夠作不少事情。信不信由你,Git 甚至能夠管理你的 Git 服務器,所以你能夠或多或少地使用 Git 自己來運行 Git 服務器。前端
固然,這涉及除平常使用 Git 以外的許多組件,其中最重要的是 Gitolite,該後端應用程序能夠管理你使用 Git 的每一個細微的配置。Gitolite 的優勢在於,因爲它使用 Git 做爲其前端接口,所以很容易將 Git 服務器管理集成到其餘基於 Git 的工做流中。Gitolite 能夠精確控制誰能夠訪問你服務器上的特定存儲庫以及他們具備哪些權限。你可使用常規的 Linux 系統工具自行管理此類事務,可是若是有好幾個用戶和不止一兩個倉庫,則須要大量的工做。linux
Gitolite 的開發人員作了艱苦的工做,使你能夠輕鬆地爲許多用戶提供對你的 Git 服務器的訪問權,而又不讓他們訪問你的整個環境 —— 而這一切,你可使用 Git 來完成所有工做。git
Gitolite 並不是圖形化的管理員和用戶面板。優秀的 Gitea 項目可提供這種體驗,可是本文重點介紹 Gitolite 的簡單優雅和使人溫馨的熟悉感。github
假設你的 Git 服務器運行在 Linux 上,則可使用包管理器安裝 Gitolite(在 CentOS 和 RHEL 上爲 yum
,在 Debian 和 Ubuntu 上爲 apt
,在 OpenSUSE 上爲 zypper
等)。例如,在 RHEL 上:shell
$ sudo yum install gitolite3
複製代碼
許多發行版的存儲庫提供的還是舊版本的 Gitolite,但最新版本爲版本 3。後端
你必須具備對服務器的無密碼 SSH 訪問權限。若是願意,你可使用密碼登陸服務器,可是 Gitolite 依賴於 SSH 密鑰,所以必須配置使用密鑰登陸的選項。若是你不知道如何配置服務器以進行無密碼 SSH 訪問,請首先學習如何進行操做(Steve Ovens 的 Ansible 文章的設置 SSH 密鑰身份驗證部分對此進行了很好的說明)。這是增強服務器管理的安全以及運行 Gitolite 的重要組成部分。安全
若是沒有 Gitolite,則若是某人請求訪問你在服務器上託管的 Git 存儲庫時,則必須向該人提供用戶賬戶。Git 提供了一個特殊的外殼,即 git-shell
,這是一個僅執行 Git 任務的特別的特定 shell。這可讓你有個只能經過很是受限的 Shell 環境來過濾訪問你的服務器的用戶。ruby
這個解決方案是一個辦法,但一般意味着用戶能夠訪問服務器上的全部存儲庫,除非你具備用於組權限的良好模式,並在建立新存儲庫時嚴格遵循這些權限。這種方式還須要在系統級別進行大量手動配置,這一般是隻有特定級別的系統管理員才能作的工做,而不必定是一般負責 Git 存儲庫的人員。bash
Gitolite 經過爲須要訪問任何存儲庫的每一個人指定一個用戶名來徹底迴避此問題。默認狀況下,該用戶名是 git
,而且因爲 Gitolite 的文檔中假定使用的是它,所以在學習該工具時保留它是一個很好的默認設置。對於曾經使用過 GitLab 或 GitHub 或任何其餘 Git 託管服務的人來講,這也是一個衆所周知的約定。
Gitolite 將此用戶稱爲託管用戶。在服務器上建立一個賬戶以充當託管用戶(我習慣使用 git
,由於這是慣例):
$ sudo adduser --create-home git
複製代碼
爲了控制該 git
用戶賬戶,該賬戶必須具備屬於你的有效 SSH 公鑰。你應該已經進行了設置,所以複製你的公鑰(而不是你的私鑰)添加到 git
用戶的家目錄中:
$ sudo cp ~/.ssh/id_ed25519.pub /home/git/
$ sudo chown git:git /home/git/id_ed25519.pub
複製代碼
若是你的公鑰不以擴展名 .pub
結尾,則 Gitolite 不會使用它,所以請相應地重命名該文件。切換爲該用戶賬戶以運行 Gitolite 的安裝程序:
$ sudo su - git
$ gitolite setup --pubkey id_ed25519.pub
複製代碼
安裝腳本運行後,git
的家用戶目錄將有一個 repository
目錄,該目錄(目前)包含存儲庫 git-admin.git
和 testing.git
。這就是該服務器所需的所有設置,如今請登出 git
用戶。
管理 Gitolite 就是編輯 Git 存儲庫中的文本文件,尤爲是 gitolite-admin.git
中的。你不會經過 SSH 進入服務器來進行 Git 管理,而且 Gitolite 也建議你不要這樣嘗試。在 Gitolite 服務器上存儲你和你的用戶的存儲庫是個裸存儲庫,所以最好不要使用它們。
$ git clone git@example.com:gitolite-admin.git gitolite-admin.git
$ cd gitolite-admin.git
$ ls -1
conf
keydir
複製代碼
該存儲庫中的 conf
目錄包含一個名爲 gitolite.conf
的文件。在文本編輯器中打開它,或使用 cat
查看其內容:
repo gitolite-admin
RW+ = id_ed22519
repo testing
RW+ = @all
複製代碼
你可能對該配置文件的功能有所瞭解:gitolite-admin
表明此存儲庫,而且 id_ed25519
密鑰的全部者具備讀取、寫入和管理 Git 的權限。換句話說,不是將用戶映射到普通的本地 Unix 用戶(由於全部用戶都使用 git
用戶託管用戶身份),而是將用戶映射到 keydir
目錄中列出的 SSH 密鑰。
testing.git
存儲庫使用特殊組符號爲訪問服務器的每一個人提供了所有權限。
若是要向 Git 服務器添加一個名爲 alice
的用戶,Alice 必須向你發送她的 SSH 公鑰。Gitolite 使用文件名的 .pub
擴展名左邊的任何內容做爲該 Git 用戶的標識符。不要使用默認的密鑰名稱值,而是給密鑰指定一個指示密鑰全部者的名稱。若是用戶有多個密鑰(例如,一個用於筆記本電腦,一個用於臺式機),則可使用子目錄來避免文件名衝突。例如,Alice 在筆記本電腦上使用的密鑰多是默認的 id_rsa.pub
,所以將其重命名爲alice.pub
或相似名稱(或讓用戶根據其計算機上的本地用戶賬戶來命名密鑰),而後將其放入 gitolite-admin.git/keydir/work/laptop/
目錄中。若是她從她的桌面計算機發送了另外一個密鑰,命名爲 alice.pub
(與上一個相同),而後將其添加到 keydir/home/desktop/
中。另外一個密鑰可能放到 keydir/home/desktop/
中,依此類推。Gitolite 遞歸地在 keydir
中搜索與存儲庫「用戶」相匹配的 .pub
文件,並將全部匹配項視爲相同的身份。
當你將密鑰添加到 keydir
目錄時,必須將它們提交回服務器。這是一件很容易忘記的事情,這裏有一個使用自動化的 Git 應用程序(例如 Sparkleshare)的真正的理由,所以任何更改都將當即提交給你的 Gitolite 管理員。第一次忘記提交和推送,在浪費了三個小時的你和你的用戶的故障排除時間以後,你會發現 Gitolite 是使用 Sparkleshare 的完美理由。
$ git add keydir
$ git commit -m 'added alice-laptop-0.pub'
$ git push origin HEAD
複製代碼
默認狀況下,Alice 能夠訪問 testing.git
目錄,所以她可使用該目錄測試鏈接性和功能。
與用戶同樣,目錄權限和組也是從你可能習慣的的常規 Unix 工具中抽象出來的(或可從在線信息查找)。在 gitolite-admin.git/conf
目錄中的 gitolite.conf
文件中授予對項目的權限。權限分爲四個級別:
R
容許只讀。在存儲庫上具備 R
權限的用戶能夠克隆它,僅此而已。RW
容許用戶執行分支的快進推送、建立新分支和建立新標籤。對於大多數用戶來講,這個基本上就像是一個「普通」的 Git 存儲庫。RW+
容許可能具備破壞性的 Git 動做。用戶能夠執行常規的快進推送、回滾推送、變基以及刪除分支和標籤。你可能想要或不但願將其授予項目中的全部貢獻者。-
明確拒絕訪問存儲庫。這與未在存儲庫的配置中列出的用戶相同。經過調整 gitolite.conf
來建立一個新的存儲庫或修改現有存儲庫的權限。例如,授予 Alice 權限來管理一個名爲 widgets.git
的新存儲庫:
repo gitolite-admin
RW+ = id_ed22519
repo testing
RW+ = @all
repo widgets
RW+ = alice
複製代碼
如今,Alice(也僅有 Alice 一我的)能夠克隆該存儲庫:
[alice]$ git clone git@example.com:widgets.git
Cloning into 'widgets'...
warning: You appear to have cloned an empty repository.
複製代碼
在第一次推送時,Alice 必須使用 -u
選項將其分支發送到空存儲庫(如同她在任何 Git 主機上作的同樣)。
爲了簡化用戶管理,你能夠定義存儲庫組:
@qtrepo = widgets
@qtrepo = games
repo gitolite-admin
RW+ = id_ed22519
repo testing
RW+ = @all
repo @qtrepo
RW+ = alice
複製代碼
正如你能夠建立組存儲庫同樣,你也能夠對用戶進行分組。默認狀況下存在一個用戶組:@all
。如你所料,它包括全部用戶,無一例外。你也能夠建立本身的組:
@qtrepo = widgets
@qtrepo = games
@developers = alice bob
repo gitolite-admin
RW+ = id_ed22519
repo testing
RW+ = @all
repo @qtrepo
RW+ = @developers
複製代碼
與添加或修改密鑰文件同樣,對 gitolite.conf
文件的任何更改都必須提交併推送以生效。
默認狀況下,Gitolite 假設存儲庫的建立是從上至下進行。例如,有權訪問 Git 服務器的項目經理建立了一個項目存儲庫,並經過 Gitolite 管理倉庫添加了開發人員。
實際上,你可能更願意向用戶授予建立存儲庫的權限。Gitolite 稱這些爲「野生倉庫(通配倉庫)」(我不肯定這是關於倉庫的造成方式的描述,仍是指配置文件所需的通配符)。這是一個例子:
@managers = alice bob
repo foo/CREATOR/[a-z]..*
C = @managers
RW+ = CREATOR
RW = WRITERS
R = READERS
複製代碼
第一行定義了一組用戶:該組稱爲 @managers
,其中包含用戶 alice
和 bob
。下一行設置了通配符容許建立尚不存在的存儲庫,放在名爲 foo
的目錄下的建立該存儲庫的用戶名的子目錄中。例如:
[alice]$ git clone git@example.com:foo/alice/cool-app.git
Cloning into cool-app'... Initialized empty Git repository in /home/git/repositories/foo/alice/cool-app.git warning: You appear to have cloned an empty repository. 複製代碼
野生倉庫的建立者可使用一些機制來定義誰能夠讀取和寫入其存儲庫,可是他們是有範圍限定的。在大多數狀況下,Gitolite 假定由一組特定的用戶來管理項目權限。一種解決方案是使用 Git 掛鉤來授予全部用戶對 gitolite-admin
的訪問權限,以要求管理者批准將更改合併到 master 分支中。
Gitolite 具備比此介紹性文章所涵蓋的更多功能,所以請嘗試一下。其文檔很是出色,一旦你通讀了它,就能夠自定義 Gitolite 服務器,以向用戶提供你喜歡的任何級別的控制。Gitolite 是一種維護成本低、簡單的系統,你能夠安裝、設置它,而後基本上就能夠將其忘卻。
via: opensource.com/article/19/…
做者:Seth Kenlon 選題:lujun9972 譯者:wxy 校對:wxy