English ▾ 主題 ▾ 最新版本 ▾ git-daemon 最後更新於 2.50.0

名稱

git-daemon - 一個非常簡單的 Git 儲存庫伺服器

概要

git daemon [--verbose] [--syslog] [--export-all]
	   [--timeout=<n>] [--init-timeout=<n>] [--max-connections=<n>]
	   [--strict-paths] [--base-path=<path>] [--base-path-relaxed]
	   [--user-path | --user-path=<path>]
	   [--interpolated-path=<pathtemplate>]
	   [--reuseaddr] [--detach] [--pid-file=<file>]
	   [--enable=<service>] [--disable=<service>]
	   [--allow-override=<service>] [--forbid-override=<service>]
	   [--access-hook=<path>] [--[no-]informative-errors]
	   [--inetd |
	     [--listen=<host-or-ipaddr>] [--port=<n>]
	     [--user=<user> [--group=<group>]]]
	   [--log-destination=(stderr|syslog|none)]
	   [<directory>…​]

描述

這是一個非常簡單的 TCP Git 守護程式 (daemon),預設監聽連接埠 "DEFAULT_GIT_PORT" (即 9418)。它會等待請求服務的連接,並在服務啟用時提供該服務。

它會驗證目錄中是否存在 "git-daemon-export-ok" 魔法檔案;如果沒有明確標記為可匯出,它將拒絕匯出任何 Git 目錄(除非指定了 --export-all 參數)。如果您將某些目錄路徑作為 git daemon 的引數傳入,則僅會開放這些目錄內的儲存庫。

預設情況下,僅啟用了 upload-pack 服務,該服務為 git fetch-packgit ls-remote 客戶端提供服務,這些客戶端由 git fetchgit pullgit clone 調用。

這非常適合唯讀更新,例如從 Git 儲存庫進行拉取 (pull)。

同時也存在一個 upload-archive 服務,用於為 git archive 提供服務。

選項

--strict-paths

精確比對路徑(即當實際路徑為 "/foo/repo.git" 或 "/foo/repo/.git" 時,不允許存取 "/foo/repo"),且不處理相對於使用者的路徑。當啟用此選項且未提供目錄引數時,git daemon 將拒絕啟動。

--base-path=<路徑>

將所有路徑請求重新對應為相對於給定路徑的路徑。這相當於「Git 根目錄」——如果您在 example.com 上以 --base-path=/srv/git 執行 git daemon,那麼當您嘗試從 git://example.com/hello.git 拉取時,git daemon 會將該路徑解釋為 /srv/git/hello.git

--base-path-relaxed

如果啟用了 --base-path 但儲存庫查詢失敗,使用此選項時,git daemon 將嘗試在不加上基底路徑字首的情況下進行查詢。這對於轉換到 --base-path 使用方式,同時仍允許舊路徑存取非常有用。

--interpolated-path=<路徑樣板>

為了支援虛擬主機,可以使用插入路徑樣板來動態建構替代路徑。樣板支援:%H 代表客戶端提供的目標主機名稱(會轉換為小寫)、%CH 代表標準主機名稱、%IP 代表伺服器的 IP 位址、%P 代表連接埠號,以及 %D 代表指定儲存庫的絕對路徑。插入完成後,系統會針對目錄列表驗證該路徑。

--export-all

允許從所有看起來像 Git 儲存庫的目錄(擁有 objectsrefs 子目錄)進行拉取,即使它們沒有 git-daemon-export-ok 檔案。

--inetd

讓伺服器作為 inetd 服務執行。隱含 --syslog(可透過 --log-destination= 覆寫)。此選項與 --detach--port--listen--user--group 選項不相容。

--listen=<主機或IP位址>

監聽特定的 IP 位址或主機名稱。如果支援,IP 位址可以是 IPv4 或 IPv6 位址。如果 IPv6 不受支援,則不支援 --listen=<主機名稱>,且 --listen 必須提供 IPv4 位址。此選項可以多次使用。與 --inetd 選項不相容。

--port=<n>

在替代連接埠上監聽。與 --inetd 選項不相容。

--init-timeout=<n>

從建立連線到收到客戶端請求之間的逾時時間(以秒為單位,通常這個值較低,因為請求應該是立即的)。

--timeout=<n>

特定客戶端子請求的逾時時間(以秒為單位)。這包括伺服器處理子請求所需的時間,以及等待下一個客戶端請求的時間。

--max-connections=<n>

並發客戶端的最大數量,預設為 32。設為 0 表示不限制。

--syslog

--log-destination=syslog 的簡寫。

--log-destination=<目的地>

將日誌訊息發送到指定目的地。請注意,此選項不隱含 --verbose,因此預設僅記錄錯誤狀況。<目的地> 必須是以下之一:

stderr

寫入標準錯誤 (standard error)。請注意,如果指定了 --detach,該行程將與實際的標準錯誤斷開,使此目的地實際上等同於 none

syslog

使用 git-daemon 識別符寫入 syslog。

none

停用所有日誌記錄。

如果指定了 --inetd--detach,預設目的地為 syslog,否則為 stderr

--user-path
--user-path=<路徑>

允許在請求中使用 ~user 記法。當未指定參數時,對 git://host/~alice/foo 的請求被視為存取使用者 alice 家目錄中 foo 儲存庫的請求。如果指定了 --user-path=<路徑>,則同樣的請求被視為存取使用者 alice 家目錄中 <路徑>/foo 儲存庫的請求。

--verbose

記錄關於傳入連線和請求檔案的詳細資訊。

--reuseaddr

在繫結監聽 Socket 時使用 SO_REUSEADDR。這允許伺服器重新啟動,而不必等待舊的連線逾時。

--detach

從 Shell 脫離 (detach)。隱含 --syslog

--pid-file=<檔案>

將行程 ID 儲存於 <檔案> 中。在 --inetd 下執行時此選項會被忽略。

--user=<使用者>
--group=<群組>

在進入服務迴圈前更改守護程式的 UID 和 GID。僅指定 --user 而不指定 --group 時,會使用該使用者的主要群組 ID。選項的值會傳遞給 getpwnam(3)getgrnam(3),不支援使用數字 ID。

--inetd 一起使用這些選項是錯誤的;如果需要,請利用 inet 守護程式的功能在衍生 git daemon 之前達成相同目的。

與許多切換使用者 ID 的程式一樣,守護程式在執行 git 程式(例如 upload-packreceive-pack)時不會重設環境變數(如 HOME)。使用此選項時,您可能還需要在啟動守護程式之前,設定並匯出 HOME 指向 <使用者> 的家目錄,並確保該目錄中的任何 Git 設定檔對 <使用者> 是可讀的。

--enable=<服務>
--disable=<服務>

預設在全站範圍內啟用/停用服務。請注意,在全站停用的服務,如果標記為可覆寫且儲存庫透過設定項目啟用該服務,仍可在個別儲存庫中啟用。

--allow-override=<服務>
--forbid-override=<服務>

允許/禁止使用個別儲存庫的設定來覆寫全站預設值。預設情況下,所有服務皆可被覆寫。

--informative-errors
--no-informative-errors

當啟用詳盡錯誤訊息時,git-daemon 會向客戶端報告更詳細的錯誤,區分「找不到儲存庫」和「儲存庫未匯出」等情況。這對客戶端較方便,但可能會洩漏關於未匯出儲存庫是否存在的資訊。當未啟用詳盡錯誤訊息時,所有錯誤都會向客戶端回報「存取被拒」。預設值為 --no-informative-errors

--access-hook=<路徑>

每當有客戶端連接時,首先執行由 <路徑> 指定的外部指令,並將服務名稱(例如 "upload-pack")、儲存庫路徑、主機名稱 (%H)、標準主機名稱 (%CH)、IP 位址 (%IP) 以及 TCP 連接埠 (%P) 作為命令列引數。外部指令可以透過以非零狀態退出(或以零狀態退出以允許)來決定是否拒絕服務。它也可以查看 $REMOTE_ADDR 和 $REMOTE_PORT 環境變數,在做此決定時了解請求者資訊。

外部指令可以選擇寫入單行文字到其標準輸出,以便在拒絕服務時將其作為錯誤訊息發送給請求者。

<目錄>

其餘引數提供目錄列表。如果指定了任何目錄,則 git-daemon 行程僅會在請求的目錄包含在這些目錄中時才會提供服務。如果指定了 --strict-paths,則請求的目錄必須與這些目錄之一完全吻合。

服務 (SERVICES)

這些服務可以使用此指令的命令列選項進行全域啟用/停用。如果需要更精細的控制(例如僅允許 git archive 在少數幾個由守護程式服務的選定儲存庫中執行),可以使用個別儲存庫的設定檔來啟用或停用它們。

upload-pack

此服務為 git fetch-packgit ls-remote 客戶端提供服務。預設啟用,但儲存庫可透過將 daemon.uploadpack 設定項目設為 false 來停用它。

upload-archive

此服務為 git archive --remote 提供服務。預設停用,但儲存庫可透過將 daemon.uploadarch 設定項目設為 true 來啟用它。

receive-pack

此服務為 git send-pack 客戶端提供服務,允許匿名推送 (push)。預設停用,因為該協定中沒有身分驗證(換句話說,任何人都可以將任何內容推送至儲存庫,包括移除引用 refs)。這僅適用於每個人都是友善的封閉 LAN 環境。此服務可透過將 daemon.receivepack 設定項目設為 true 來啟用。

範例

我們假設 /etc/services 中存在以下內容:
$ grep 9418 /etc/services
git		9418/tcp		# Git Version Control System
git daemon 作為 inetd 伺服器

若要將 git daemon 設定為處理 /pub/foo/pub/bar 內任何儲存庫的 inetd 服務,請將類似下列的條目加入到 /etc/inetd 中,並確保都在同一行:

	git stream tcp nowait nobody  /usr/bin/git
		git daemon --inetd --verbose --export-all
		/pub/foo /pub/bar
git daemon 作為虛擬主機的 inetd 伺服器

若要將 git daemon 設定為處理不同虛擬主機(www.example.comwww.example.org)儲存庫的 inetd 服務,請將類似下列的條目加入到 /etc/inetd 中,並確保都在同一行:

	git stream tcp nowait nobody /usr/bin/git
		git daemon --inetd --verbose --export-all
		--interpolated-path=/pub/%H%D
		/pub/www.example.org/software
		/pub/www.example.com/software
		/software

在此範例中,根目錄 /pub 將包含每個受支援虛擬主機名稱的子目錄。此外,兩個主機都簡單地將儲存庫宣傳為 git://www.example.com/software/repo.git。對於 1.4.0 之前的客戶端,也可以建立一個從 /software 指向適當預設儲存庫的符號連結。

git daemon 作為虛擬主機的一般守護程式

若要將 git daemon 設定為處理多個虛擬主機(基於其 IP 位址)儲存庫的一般(非 inetd)服務,請像這樣啟動守護程式:

	git daemon --verbose --export-all
		--interpolated-path=/pub/%IP/%D
		/pub/192.168.1.200/software
		/pub/10.10.220.23/software

在此範例中,根目錄 /pub 將包含每個受支援虛擬主機 IP 位址的子目錄。不過,儲存庫仍然可以透過主機名稱來存取,前提是它們對應到這些 IP 位址。

選擇性地啟用/停用個別儲存庫服務

若要針對某個儲存庫啟用 git archive --remote 並停用 git fetch,請在儲存庫的設定檔中加入以下內容(該檔案即為 HEADrefsobjects 旁的 config 檔案):

	[daemon]
		uploadpack = false
		uploadarch = true

環境變數

git daemon 會將 REMOTE_ADDR 設定為連接到它的客戶端 IP 位址(如果 IP 位址可用)。當執行服務時,REMOTE_ADDR 將可在被呼叫的掛鉤 (hooks) 環境中使用。

GIT

git[1] 套件的一部分