對於提供公共的,非授權的唯讀訪問,我們可以拋棄 HTTP 協議,改用 Git 自己的協議,這主要是出於性能和速度的考慮。Git 協定遠比 HTTP 協定高效,因而存取速度也快,所以它能節省很多用戶的時間。
重申一下,這一點隻適用於非授權的唯讀訪問。如果建在防火牆之外的伺服器上,那麼它所提供的服務應該只是那些公開的唯讀項目。如果是在防火牆之內的伺服器上,可用于支撐大量參與人員或自動系統(用於持續集成或編譯的主機)唯讀訪問的專案,這樣可以省去逐一配置 SSH 公開金鑰的麻煩。
但不管哪種情形,Git 協定的配置設定都很簡單。基本上,只要以守護進程的形式運行該命令即可:
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
的用戶(譯注:新建用戶默認對倉庫檔不具備寫許可權,但這取決於倉庫目錄的許可權設定。務必確認 git-ro
對倉庫只能讀不能寫。),並用它的身份來啟動進程。這裡為了簡化,後面我們還是用之前運行 Gitosis 的用戶 'git'。
這樣一來,當你重啟電腦時,Git 進程也會自動啟動。要是進程意外退出或者被殺掉,也會自行重啟。在設置完成後,不重啟電腦就啟動該守護進程,可以運行:
initctl start local-git-daemon
而在其他作業系統上,可以用 xinetd
,或者 sysvinit
系統的腳本,或者其他類似的腳本 — 只要能讓那個命令變為守護進程並可監控。
接下來,我們必須告訴 Gitosis 哪些倉庫允許通過 Git 協議進行匿名唯讀訪問。如果每個倉庫都設有各自的段落,可以分別指定是否允許 Git 進程開放給使用者匿名讀取。比如允許通過 Git 協議訪問 iphone_project,可以把下面兩行加到 gitosis.conf
文件的末尾:
[repo iphone_project]
daemon = yes
在提交和推送完成後,運行中的 Git 守護進程就會回應來自 9418 埠對該專案的訪問請求。
如果不考慮 Gitosis,單單起了 Git 守護進程的話,就必須到每一個允許匿名唯讀訪問的倉庫目錄內,創建一個特殊名稱的空檔作為標誌:
$ cd /path/to/project.git
$ touch git-daemon-export-ok
該檔的存在,表明允許 Git 守護進程開放對該專案的匿名唯讀訪問。
Gitosis 還能設定哪些項目允許放在 GitWeb 上顯示。先打開 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_project 項目在 GitWeb 裡出現,把 repo
的設定改成下面的樣子:
[repo iphone_project]
daemon = yes
gitweb = yes
在提交並推送過之後,GitWeb 就會自動開始顯示 iphone_project 專案的細節和歷史。