簡體中文 ▾ 主題 ▾ 最新版本 ▾ 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 守護程序,通常監聽埠“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 倉庫拉取內容。

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

選項

--strict-paths

精確匹配路徑(即,當真實路徑是“/foo/repo.git”或“/foo/repo/.git”時,不允許“/foo/repo”)且不執行使用者相對路徑。當啟用此選項且未提供目錄引數時,git daemon 將拒絕啟動。

--base-path=<path>

將所有路徑請求重新對映為相對於給定路徑。這類似於“Git 根目錄”——如果你在 example.com 上執行 git daemon 並使用 --base-path=/srv/git,那麼當你稍後嘗試從 git://example.com/hello.git 拉取時,git daemon 會將路徑解釋為 /srv/git/hello.git

--base-path-relaxed

如果啟用了 --base-path 且倉庫查詢失敗,則使用此選項,git daemon 將嘗試不帶字首地查詢基礎路徑。這對於切換到 --base-path 用法很有用,同時仍允許舊路徑。

--interpolated-path=<pathtemplate>

為了支援虛擬主機,可以使用插入路徑模板來動態構建備用路徑。該模板支援 %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=<host-or-ipaddr>

監聽指定的 IP 地址或主機名。如果支援,IP 地址可以是 IPv4 地址或 IPv6 地址。如果不支援 IPv6,則 --listen=<hostname> 也不受支援,--listen 必須給定一個 IPv4 地址。可以多次給定。與 --inetd 選項不相容。

--port=<n>

監聽備用埠。與 --inetd 選項不相容。

--init-timeout=<n>

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

--timeout=<n>

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

--max-connections=<n>

最大併發客戶端數量,預設為 32。設定為零表示無限制。

--syslog

--log-destination=syslog 的簡寫。

--log-destination=<destination>

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

stderr

寫入標準錯誤。請注意,如果指定了 --detach,程序將與實際的標準錯誤斷開連線,使此目標實際上等同於 none

syslog

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

none

停用所有日誌記錄。

如果指定了 --inetd--detach,預設目標是 syslog,否則是 stderr

--user-path
--user-path=<path>

允許在請求中使用 ~user 表示法。當不帶引數指定時,對 git://host/~alice/foo 的請求被視為訪問使用者 alice 主目錄中的 foo 倉庫的請求。如果指定了 --user-path=<path>,則相同的請求被視為訪問使用者 alice 主目錄中的 <path>/foo 倉庫的請求。

--verbose

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

--reuseaddr

在繫結監聽套接字時使用 SO_REUSEADDR。這允許伺服器重啟而無需等待舊連線超時。

--detach

從 shell 分離。隱含 --syslog

--pid-file=<file>

將程序 ID 儲存到 <file> 中。當守護程序在 --inetd 下執行時,此選項將被忽略。

--user=<user>
--group=<group>

在進入服務迴圈之前更改守護程序的 uid 和 gid。如果僅給出 --user 而沒有 --group,則使用該使用者的主組 ID。選項的值將傳遞給 getpwnam(3)getgrnam(3),不支援數字 ID。

將這些選項與 --inetd 一起使用會報錯;如果需要,請在啟動 git daemon 之前使用 inet 守護程序的功能來實現相同目的。

與許多切換使用者 ID 的程式一樣,當守護程序執行 Git 程式(例如 upload-packreceive-pack)時,它不會重置 HOME 等環境變數。使用此選項時,你可能還希望在啟動守護程序之前設定並匯出 HOME 指向 <user> 的主目錄,並確保該目錄中的任何 Git 配置檔案可被 <user> 讀取。

--enable=<service>
--disable=<service>

預設情況下在全站啟用/停用服務。請注意,如果服務被標記為可覆蓋並且倉庫透過配置項啟用了該服務,則全站停用的服務仍然可以針對每個倉庫啟用。

--allow-override=<service>
--forbid-override=<service>

允許/禁止使用每個倉庫的配置覆蓋全站預設設定。預設情況下,所有服務都可以被覆蓋。

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

當啟用資訊性錯誤時,git-daemon 將向客戶端報告更詳細的錯誤,區分諸如“無此倉庫”和“倉庫未匯出”等情況。這對於客戶端來說更方便,但可能會洩露有關未匯出倉庫存在的資訊。當未啟用資訊性錯誤時,所有錯誤都會向客戶端報告“訪問被拒絕”。預設是 --no-informative-errors

--access-hook=<path>

每當客戶端連線時,首先執行由 <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 客戶端提供服務,允許匿名推送。它預設停用,因為協議中沒有身份驗證(換句話說,任何人都可以將任何內容推送到倉庫中,包括刪除引用)。這僅適用於所有人都友好的封閉區域網環境。可以透過將 daemon.receivepack 配置項設定為 true 來啟用此服務。

示例

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

要將 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
作為虛擬主機的 inetd 伺服器的 git daemon

要將 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 daemonREMOTE_ADDR 設定為連線到它的客戶端的 IP 地址(如果 IP 地址可用)。執行服務時呼叫的鉤子環境中將提供 REMOTE_ADDR

GIT

Git[1] 套件的一部分

scroll-to-top