對于提供公共的,非授權的只讀訪問,我們可以拋棄 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 項目的細節和歷史。
- 1. 起步
- 1.1 關于版本控制
- 1.2 Git 簡史
- 1.3 Git 基礎
- 1.4 安裝 Git
- 1.5 初次運行 Git 前的配置
- 1.6 獲取幫助
- 1.7 小結
- 2. Git基礎
- 2.1 取得項目的 Git 倉庫
- 2.2 記錄每次更新到倉庫
- 2.3 查看提交歷史
- 2.4 撤消操作
- 2.5 遠程倉庫的使用
- 2.6 打標簽
- 2.7 技巧和竅門
- 2.8 小結
- 3. Git分支
- 3.1 何謂分支
- 3.2 分支的新建與合并
- 3.3 分支的管理
- 3.4 利用分支進行開發的工作流程
- 3.5 遠程分支
- 3.6 分支的衍合
- 3.7 小結
- 4. 服務器上的Git
- 4.1 協議
- 4.2 在服務器上部署 Git
- 4.3 生成 SSH 公鑰
- 4.4 架設服務器
- 4.5 公共訪問
- 4.6 GitWeb
- 4.7 Gitosis
- 4.8 Gitolite
- 4.9 Git 守護進程
- 4.10 Git 托管服務
- 4.11 小結
- 5. 分布式Git
- 5.1 分布式工作流程
- 5.2 為項目作貢獻
- 5.3 項目的管理
- 5.4 小結
- 6. Git工具
- 6.1 修訂版本(Revision)選擇
- 6.2 交互式暫存
- 6.3 儲藏(Stashing)
- 6.4 重寫歷史
- 6.5 使用 Git 調試
- 6.6 子模塊
- 6.7 子樹合并
- 6.8 總結
- 7. 自定義Git
- 7.1 配置 Git
- 7.2 Git屬性
- 7.3 Git掛鉤
- 7.4 Git 強制策略實例
- 7.5 總結
- 8. Git與其他系統
- 8.1 Git 與 Subversion
- 8.2 遷移到 Git
- 8.3 總結
- 9. Git 內部原理
- 9.2 Git 對象
- 9.3 Git References
- 9.4 Packfiles
- 9.5 The Refspec
- 9.6 傳輸協議
- 9.7 維護及數據恢復
- 9.8 總結
- 9.1 底層命令 (Plumbing) 和高層命令 (Porcelain)