## Smart HTTP
我們一般通過 SSH 進行授權訪問,通過 `git:// `進行無授權訪問,但是還有一種協議可以同時實現以上兩種方式的訪問。 設置 Smart HTTP 一般只需要在服務器上啟用一個 Git 自帶的名為 `git-http-backend 的 CGI` 腳本。
該 CGI *(Common Gateway Interface 公共網關接口,是web服務器與外部應用程序如web應用之間的通信接口,是一個協議) *
腳本將會讀取由 `git fetch` 或 `git push` 命令向 HTTP URL 發送的請求路徑和頭部信息,來判斷該客戶端是否支持 HTTP 通信(不低于 1.6.6 版本的客戶端支持此特性)。 如果 CGI 發現該客戶端支持智能(Smart)模式,它將會以智能模式與它進行通信,否則它將會回落到啞(Dumb)模式下(因此它可以對某些老的客戶端實現向下兼容)。
在完成以上簡單的安裝步驟后, 我們將用 Apache 來作為 CGI 服務器。 如果你沒有安裝 Apache,你可以在 Linux 環境下執行如下或類似的命令來安裝:
~~~
$ sudo apt-get install apache2 apache2-utils
$ a2enmod cgi alias env
~~~
該操作將會啟用 mod_cgi, mod_alias, 和 mod_env 等 Apache 模塊, 這些模塊都是使該功能正常工作所必須的。
接下來我們要向 Apache 配置文件添加一些內容,來讓 git-http-backend 作為 Web 服務器對 /git 路徑請求的處理器。
~~~
SetEnv GIT_PROJECT_ROOT /opt/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
~~~
如果留空 GIT_HTTP_EXPORT_ALL 這個環境變量,Git 將只對無授權客戶端提供帶 git-daemon-export-ok 文件的版本庫,就像 Git 守護進程一樣。
接著你需要讓 Apache 接受通過該路徑的請求,添加如下的內容至 Apache 配置文件:
~~~
<Directory "/usr/lib/git-core*">
Options ExecCGI Indexes
Order allow,deny
Allow from all
Require all granted
</Directory>
~~~
最后,如果想實現寫操作授權驗證,使用如下的未授權屏蔽配置即可:
~~~
<LocationMatch "^/git/.*/git-receive-pack$">
AuthType Basic
AuthName "Git Access"
AuthUserFile /opt/git/.htpasswd
Require valid-user
</LocationMatch>
~~~
這需要你創建一個包含所有合法用戶密碼的 .htaccess 文件。 以下是一個添加 “schacon” 用戶到此文件的例子:
~~~
$ htdigest -c /opt/git/.htpasswd "Git Access" schacon
~~~
你可以通過許多方式添加 Apache 授權用戶,選擇使用其中一種方式即可。 以上僅僅只是我們可以找到的最簡單的一個例子。 如果愿意的話,你也可以通過 SSL 運行它,以保證所有數據是在加密狀態下進行傳輸的。
我們不想深入去講解 Apache 配置文件,因為你可能會使用不同的 Web 服務器,或者可能有不同的授權需求。 它的主要原理是使用一個 Git 附帶的,名為 `git-http-backend 的 CGI`。它被引用來處理協商通過 HTTP 發送和接收的數據。 它本身并不包含任何授權功能,但是授權功能可以在 Web 服務器層引用它時被輕松實現。 你可以在任何所有可以處理 CGI 的 Web 服務器上辦到這點,所以隨便挑一個你最熟悉的 Web 服務器試手吧。
>Note
欲了解更多的有關配置 Apache 授權訪問的信息,請通過以下鏈接瀏覽 Apache 文檔: http://httpd.apache.org/docs/current/howto/auth.html
- 第一章 起步
- 1.1 關于版本控制
- 1.2 Git 簡史
- 1.3 Git 基礎
- 1.4 命令行
- 1.5 安裝 Git
- 1.6 初次運行 Git 前的配置
- 1.7 獲取幫助
- 1.8 總結
- 第二章 Git基礎
- 2.1 獲取 Git 倉庫
- 2.2 記錄每次更新到倉庫
- 2.3 查看提交歷史
- 2.4 撤消操作
- 2.5 遠程倉庫的使用
- 2.6 打標簽
- 2.7 Git 別名
- 2.8 總結
- 第三章 Git分支
- 3.1 分支簡介
- 3.2 分支的新建與合并
- 3.3 分支管理
- 3.4 分支開發工作流
- 3.5 遠程分支
- 3.6 變基
- 3.7 總結
- 第四章 服務器上Git
- 4.1 協議
- 4.2 在服務器上搭建 Git
- 4.3 生成 SSH 公鑰
- 4.4 配置服務器
- 4.5 Git 守護進程 TODO
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的選擇
- 4.10 總結
- 第五章 分布式Git
- 5.1 分布式工作流程
- 第六章 GitHub
- 第七章 Git工具
- 第八章 自定義Git
- 第九章 Git于其他系統
- 第十章 Git內部原理
- 附錄A 其他環境中的Git
- A1.1 圖形界面 TODO
- A1.2 Visual Studio 中的 Git TODO
- A1.3 Eclipse 中的 Git
- 附錄B 將Git嵌入你的應用
- 附錄C Git命令
- 附錄D 常用命令
- D.1 配置和設置
- D.2 幫助
- D.3 創建和獲取倉庫
- D.4 文件狀態
- D.5 查看日志