使用 Git 來管理 Git 伺服器
正如我在系列文章中演示的那樣,Git 除了跟蹤源代碼外,還可以做很多事情。信不信由你,Git 甚至可以管理你的 Git 伺服器,因此你可以或多或少地使用 Git 本身來運行 Git 伺服器。
當然,這涉及除日常使用 Git 之外的許多組件,其中最重要的是 Gitolite,該後端應用程序可以管理你使用 Git 的每個細微的配置。Gitolite 的優點在於,由於它使用 Git 作為其前端介面,因此很容易將 Git 伺服器管理集成到其他基於 Git 的工作流中。Gitolite 可以精確控制誰可以訪問你伺服器上的特定存儲庫以及他們具有哪些許可權。你可以使用常規的 Linux 系統工具自行管理此類事務,但是如果有好幾個用戶和不止一兩個倉庫,則需要大量的工作。
Gitolite 的開發人員做了艱苦的工作,使你可以輕鬆地為許多用戶提供對你的 Git 伺服器的訪問權,而又不讓他們訪問你的整個環境 —— 而這一切,你可以使用 Git 來完成全部工作。
Gitolite 並不是圖形化的管理員和用戶面板。優秀的 Gitea 項目可提供這種體驗,但是本文重點介紹 Gitolite 的簡單優雅和令人舒適的熟悉感。
安裝 Gitolite
假設你的 Git 伺服器運行在 Linux 上,則可以使用包管理器安裝 Gitolite(在 CentOS 和 RHEL 上為 yum
,在 Debian 和 Ubuntu 上為 apt
,在 OpenSUSE 上為 zypper
等)。例如,在 RHEL 上:
$ sudo yum install gitolite3
許多發行版的存儲庫提供的仍是舊版本的 Gitolite,但最新版本為版本 3。
你必須具有對伺服器的無密碼 SSH 訪問許可權。如果願意,你可以使用密碼登錄伺服器,但是 Gitolite 依賴於 SSH 密鑰,因此必須配置使用密鑰登錄的選項。如果你不知道如何配置伺服器以進行無密碼 SSH 訪問,請首先學習如何進行操作(Steve Ovens 的 Ansible 文章的設置 SSH 密鑰身份驗證部分對此進行了很好的說明)。這是加強伺服器管理的安全以及運行 Gitolite 的重要組成部分。
配置 Git 用戶
如果沒有 Gitolite,則如果某人請求訪問你在伺服器上託管的 Git 存儲庫時,則必須向該人提供用戶帳戶。Git 提供了一個特殊的外殼,即 git-shell
,這是一個僅執行 Git 任務的特別的特定 shell。這可以讓你有個只能通過非常受限的 Shell 環境來過濾訪問你的伺服器的用戶。
這個解決方案是一個辦法,但通常意味著用戶可以訪問伺服器上的所有存儲庫,除非你具有用於組許可權的良好模式,並在創建新存儲庫時嚴格遵循這些許可權。這種方式還需要在系統級別進行大量手動配置,這通常是只有特定級別的系統管理員才能做的工作,而不一定是通常負責 Git 存儲庫的人員。
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
管理 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: https://opensource.com/article/19/4/server-administration-git
作者:Seth Kenlon 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive