對於提供公共的,非受權的只讀訪問,咱們能夠拋棄 HTTP 協議,改用 Git 本身的協議,這主要是出於性能和速度的考慮。Git 協議遠比 HTTP 協議高效,於是訪問速度也快,因此它能節省不少用戶的時間。git
重申一下,這一點只適用於非受權的只讀訪問。若是建在防火牆以外的服務器上,那麼它所提供的服務應該只是那些公開的只讀項目。若是是在防火牆以內的 服務器上,可用於支撐大量參與人員或自動系統(用於持續集成或編譯的主機)只讀訪問的項目,這樣能夠省去逐一配置 SSH 公鑰的麻煩。web
但無論哪一種情形,Git 協議的配置設定都很簡單。基本上,只要以守護進程的形式運行該命令便可:shell
git daemon --reuseaddr ----export-all --base-path=/opt/git/ /opt/git/
這裏的 --reuseaddr
選項表示在重啓服務前,不等以前的鏈接超時就當即重啓。而 --base-path
選項則容許克隆項目時沒必要給出完整路徑。最後面的路徑告訴 Git 守護進程容許開放給用戶訪問的倉庫目錄。假若有防火牆,則須要爲該主機的 9418 端口設置爲容許通訊。安全
以守護進程的形式運行該進程的方法有不少,但主要還得看用的是什麼操做系統。在 Ubuntu 主機上,能夠用 Upstart 腳本達成。編輯該文件:服務器
/etc/event.d/local-git-daemon
加入如下內容:iphone
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 進程也會自動啓動。要是進程意外退出或者被殺掉,也會自行重啓。在設置完成後,不重啓計算機就啓動該守護進程,能夠運行:url
initctl start local-git-daemon
而在其餘操做系統上,能夠用 xinetd
,或者 sysvinit
系統的腳本,或者其餘相似的腳本 — 只要能讓那個命令變爲守護進程並可監控。spa
接下來,咱們必須告訴 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 項目的細節和歷史。