-
A1. 附錄 A: Git 在其他環境
- A1.1 圖形介面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 小結
-
A2. 附錄 B: 在應用程式中嵌入 Git
-
A3. 附錄 C: Git 命令
4.6 伺服器上的 Git - 智慧 HTTP
智慧 HTTP
我們現在已經透過 SSH 實現了認證訪問,並透過 git://
實現了非認證訪問,但還有一種協議可以同時實現這兩種訪問。設定智慧 HTTP 基本上就是啟用 Git 提供的一個 CGI 指令碼,名為 git-http-backend
,在伺服器上。這個 CGI 會讀取 git fetch
或 git push
到 HTTP URL 時傳送的路徑和頭部,並判斷客戶端是否可以透過 HTTP 進行通訊(自 1.6.6 版本以來,任何客戶端都支援)。如果 CGI 發現客戶端是智慧的,它將與客戶端進行智慧通訊;否則它將回退到非智慧行為(因此對於舊客戶端的讀取是向後相容的)。
讓我們來看一個非常基本的設定。我們將使用 Apache 作為 CGI 伺服器。如果你沒有設定 Apache,可以在 Linux 系統上像這樣操作
$ sudo apt-get install apache2 apache2-utils
$ a2enmod cgi alias env
這還會啟用 mod_cgi
、mod_alias
和 mod_env
模組,這些模組都是使其正常工作所必需的。
你還需要將 /srv/git
目錄的 Unix 使用者組設定為 www-data
,這樣你的 Web 伺服器才能擁有倉庫的讀寫許可權,因為執行 CGI 指令碼的 Apache 例項(預設情況下)將以此使用者執行
$ chgrp -R www-data /srv/git
接下來,我們需要在 Apache 配置中新增一些內容,以便將 git-http-backend
作為 Web 伺服器 /git
路徑下所有請求的處理程式來執行。
SetEnv GIT_PROJECT_ROOT /srv/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 daemon 所做的那樣。
最後,你需要告訴 Apache 允許對 git-http-backend
的請求,並透過某種方式進行寫入認證,例如使用如下的 Auth 塊
<Files "git-http-backend">
AuthType Basic
AuthName "Git Access"
AuthUserFile /srv/git/.htpasswd
Require expr !(%{QUERY_STRING} -strmatch '*service=git-receive-pack*' || %{REQUEST_URI} =~ m#/git-receive-pack$#)
Require valid-user
</Files>
這將要求你建立一個包含所有有效使用者密碼的 .htpasswd
檔案。以下是向檔案中新增“schacon”使用者的示例
$ htpasswd -c /srv/git/.htpasswd schacon
Apache 有多種使用者認證方式,你必須選擇並實現其中一種。這只是我們能想到的最簡單的例子。你幾乎肯定會希望透過 SSL 設定此功能,以便所有資料都被加密。
我們不想過多深入 Apache 配置的細節,因為你可能使用不同的伺服器或有不同的認證需求。核心思想是 Git 帶有一個名為 git-http-backend
的 CGI,它在被呼叫時會執行所有協商,透過 HTTP 傳送和接收資料。它本身不實現任何認證,但這可以透過呼叫它的 Web 伺服器層輕鬆控制。你幾乎可以使用任何支援 CGI 的 Web 伺服器來完成此操作,所以請選擇你最熟悉的一個。
注意
|
有關 Apache 中配置認證的更多資訊,請檢視 Apache 文件:https://httpd.apache.org/docs/current/howto/auth.html。 |