Git
英文 ▾ 主題 ▾ 最新版本 ▾ git-daemon 最後更新於 2.44.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 精靈,通常監聽 "DEFAULT_GIT_PORT" 也就是 9418 連接埠。 它會等待連線要求服務,如果該服務已啟用,則會提供該服務。

它會驗證目錄中是否有神奇的檔案 "git-daemon-export-ok",並且會拒絕匯出任何未明確標記為要以此方式匯出的 Git 目錄(除非指定 --export-all 參數)。如果您將一些目錄路徑作為 *git daemon* 參數傳遞,則提供的服務會限制在這些目錄內的儲存庫。

預設情況下,只有 upload-pack 服務啟用,該服務提供 *git fetch-pack* 和 *git ls-remote* 客戶端,這些客戶端是從 *git fetch*、*git pull* 和 *git clone* 呼叫的。

這非常適合唯讀更新,也就是從 Git 儲存庫中提取。

也存在 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 儲存庫的所有目錄(具有 *objects* 和 *refs* 子目錄)中提取,即使它們沒有 *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。設定為零表示沒有限制。

--syslog

--log-destination=syslog 的簡寫。

--log-destination=<目的地>

將日誌訊息傳送到指定的目的地。請注意,此選項並不暗示 --verbose,因此預設情況下只會記錄錯誤情況。<目的地> 必須是以下其中一個

stderr

寫入標準錯誤。請注意,如果指定了 --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 中分離。暗示 --syslog。

--pid-file=<檔案>

將程序 ID 儲存到 *檔案* 中。當在 --inetd 下執行精靈時會忽略此選項。

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

在進入服務迴圈之前變更精靈的 uid 和 gid。當只給出 --user 而沒有 --group 時,會使用使用者的主要群組 ID。選項的值會給定給 getpwnam(3)getgrnam(3),並且不支援數字 ID。

當與 --inetd 一起使用時,提供這些選項是錯誤的;如果需要,請在產生 *git daemon* 之前,使用 inet 精靈的功能來達成相同的效果。

像許多切換使用者 ID 的程式一樣,精靈在執行 git 程式(例如 upload-packreceive-pack)時不會重設環境變數(例如 $HOME)。使用此選項時,您可能也需要設定並匯出 HOME,使其指向 <使用者> 的家目錄,並確保該目錄中的任何 Git 設定檔都可由 <使用者> 讀取。

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

預設情況下,全網站範圍內啟用/停用服務。請注意,如果服務標記為可覆寫,並且儲存庫使用組態項目啟用該服務,則在全網站範圍內停用的服務仍然可以在每個儲存庫中啟用。

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

允許/禁止使用每個儲存庫組態覆寫全網站預設值。預設情況下,所有服務都可以覆寫。

--[no-]informative-errors

當啟用資訊豐富的錯誤時,git-daemon 將會向客戶端報告更詳細的錯誤,從「沒有此儲存庫」等情況中區分出「儲存庫未匯出」。這對客戶端更方便,但可能會洩漏有關未匯出儲存庫存在性的資訊。當未啟用資訊豐富的錯誤時,所有錯誤都會向客戶端報告「拒絕存取」。預設為 --no-informative-errors。

--access-hook=<路徑>

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

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

<directory>

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

服務

這些服務可以使用此命令的命令列選項全域啟用/停用。如果需要更精細的控制(例如,只允許在少數選定的儲存庫中執行 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 客戶端,允許匿名推送。預設情況下已停用,因為協定中沒有身份驗證(換句話說,任何人都可以將任何內容推送到儲存庫中,包括刪除參考)。這僅適用於每個人都很友善的封閉 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

環境

如果 IP 位址可用,git daemon 會將 REMOTE_ADDR 設定為連線到它的客戶端的 IP 位址。執行服務時呼叫的 Hook 環境中將會提供 REMOTE_ADDR。

GIT

屬於 git[1] 套件的一部分

scroll-to-top