Pro Git 4.9 Git Daemon

出自DILA Wiki

如果您的專案要提供公共、非授權的唯讀訪問,您會想要略過 HTTP 協議而使用 Git 協議。主因在於速度。Git 協定效率遠高於 HTTP,因而比 HTTP 協議更迅速,所以它能節省很多時間。

重申一下,這一點只適用於非授權、唯讀的訪問。如果在防火牆之外的伺服器上,該服務的使用應該局限于公諸於世的專案。假如是在防火牆之內,它也可以用於具有大量參與人員或者主機(長期整合資源或編譯的伺服器)的唯讀訪問的專案,可以省去逐一添加 SSH 公開金鑰的麻煩。

無論哪種情況,Git 協定的設定都相對簡單。基本上,只要以常駐程序(daemon)的形式運行該命令:

git daemon --reuseaddr --base-path=/opt/git/ /opt/git/

--reuseaddr 使得服務無須等到舊的連接嘗試過期以後再重啟,--base-path 選項使得克隆專案的時候不用給出完整的路徑,而最後面的路徑告訴 Git 程序匯出倉庫的位置。假如有防火牆,則需要為該主機的 9418 埠打個允許通信的洞。

有幾個不同的辦法可以讓該程序長期駐留,取決於不同的作業系統。在 Ubuntu 主機上,可以用 Upstart 腳本來完成。於是,在下面這個檔

/etc/event.d/local-git-daemon

加入該腳本內容:

start on startup
stop on shutdown
exec /usr/bin/git daemon \
    --user=git --group=git \
    --reuseaddr \
    --base-path=/opt/git/ \
    /opt/git/
respawn

出於安全考慮,強烈建議用一個對倉庫只有讀取許可權的使用者身份來運行該進程——只需要簡單的新創建一個 git-ro 用戶(譯注:並將它對倉庫的許可權設為唯讀),用它來運行進程。為了簡化,下面我們將依舊使用運行了 Gitosis 的 ‘git’ 用戶。

重啟主機的時候,Git 進程會自行啟動,一旦關閉了也會自行重啟。想要不重新啟動機器就開啟這個程序,可以執行這個命令:

initctl start local-git-daemon

在其他系統上,或許應該使用 xinetd,sysinit 的一個腳本,或者其他的——只要能讓那個命令進程化和可監控。

然後,必須告訴 Gitosis 服務那些倉庫允許基於 Git 協議的非授權訪問。如果為每一個倉庫設立了自己的區段(section),就可以指定想讓 Git 進程給予可讀許可權的倉庫。假如要允許通過 Git 協議訪問前面的 iphone 專案,可以把如下內容加到 gitosis.conf 文件的結尾:

[repo iphone_project]
daemon = yes

在提交和推送完成以後,運行中的進程將開始回應所有能訪問主機 9418 埠的人發來的項目請求。

假如不想使用 Gitosis,而又想架設一個 Git daemon,則必須為每一個想使用 Git daemon 的專案執行如下命令:

$ cd /path/to/project.git
$ touch git-daemon-export-ok

該文件(譯注:指空檔 git-deamon-export-ok)告訴 Git 允許對該專案的非授權訪問。

Gitosis 還能控制 GitWeb 顯示哪些專案。首先,在 /etc/gitweb.conf 添加如下內容:

$projects_list = "/home/git/gitosis/projects.list";
$projectroot = "/home/git/repositories";
$export_ok = "git-daemon-export-ok";
@git_base_url_list = ('git://gitserver');

通過在 Gitosis 的設置檔裡添加或刪除 gitweb 設定,就能控制 GitWeb 允許用戶流覽哪些專案。比如,我們想讓 iphone 專案 在 GitWeb 裡出現,把 repo 的設定改成下面的樣子:

[repo iphone_project]
daemon = yes
gitweb = yes

如果現在提交和推送該專案,GitWeb 會自動開始展示我們的 iphone 專案。