-
1. 起步
-
2. Git 基礎
-
3. Git 分支
-
4. 伺服器上的 Git
- 4.1 協議
- 4.2 在伺服器上部署 Git
- 4.3 生成 SSH 公鑰
- 4.4 架設伺服器
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方託管服務
- 4.10 小結
-
5. 分散式 Git
-
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 on the Server - Smart HTTP
Smart HTTP
我們現在可以透過 SSH 進行認證訪問,並透過 git:// 進行非認證訪問,但還有一種協議可以同時完成這兩件事。設定 Smart HTTP 基本上就是啟用 Git 自帶的一個名為 git-http-backend 的 CGI 指令碼。這個 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。 |