# git-daemon
> 原文: [https://git-scm.com/docs/git-daemon](https://git-scm.com/docs/git-daemon)
## 名稱
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守護程序_參數傳遞,則可以進一步將要約限制為包含這些路徑的白名單。
默認情況下,僅啟用`upload-pack`服務,該服務為 _git fetch-pack_ 和 _git ls-remote_ 客戶端提供服務,這些客戶端是從 _git fetch_ 調用的, _git pull_ 和 _git clone_ 。
這非常適合只讀更新,即從Git存儲庫中提取。
還存在`upload-archive`以服務 _git存檔_。
## OPTIONS
```
--strict-paths
```
完全匹配路徑(即當真實路徑是“/foo/repo.git”或“/foo/repo/.git”時不允許“/ foo / repo”)并且不做用戶相對路徑。啟用此選項且未指定白名單時, _git守護程序_將拒絕啟動。
```
--base-path=<path>
```
將所有路徑請求重新映射為相對于給定路徑。這有點像“Git root” - 如果你在example.com上用 _--base-path = / srv / git_ 運行 _git守護進程_,那么如果你以后嘗試拉 _git://example.com/hello.git_ , _git守護程序_會將路徑解釋為 _/srv/git/hello.git_ 。
```
--base-path-relaxed
```
如果啟用了--base-path并且repo lookup失敗,則使用此選項 _git守護程序_將嘗試在不添加基本路徑前綴的情況下進行查找。這對于切換到--base-path用法很有用,同時仍允許舊路徑。
```
--interpolated-path=<pathtemplate>
```
為了支持虛擬主機,可以使用內插路徑模板來動態構建備用路徑。模板支持客戶端提供的目標主機名%H,但轉換為全部小寫,%CH為規范主機名,%IP為服務器IP地址,%P為端口號,%D為絕對路徑命名的存儲庫。插值后,路徑將根據目錄白名單進行驗證。
```
--export-all
```
允許從所有看起來像Git存儲庫的目錄(具有_對象_和 _refs_ 子目錄)中拉出,即使它們沒有 _git-daemon-export-ok_ ]文件。
```
--inetd
```
讓服務器作為inetd服務運行。意味著--sloglog(可以用`--log-destination=`覆蓋)。與--detach, - port, - liste, - 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
```
使用`git-daemon`標識符寫入syslog。
```
none
```
禁用所有日志記錄
如果指定了`--inetd`或`--detach`,則默認目標為`syslog`,否則為`stderr`。
```
--user-path
```
```
--user-path=<path>
```
允許?用戶表示法用于請求。當沒有參數指定時,對git:// host / ~alice / foo的請求被視為訪問用戶`alice`主目錄中的 _foo_ 存儲庫的請求。如果指定了`--user-path=path`,則將相同的請求作為訪問用戶`alice`的主目錄中的`path/foo`存儲庫的請求。
```
--verbose
```
記錄有關傳入連接和請求文件的詳細信息。
```
--reuseaddr
```
綁定偵聽套接字時使用SO_REUSEADDR。這允許服務器重新啟動而無需等待舊連接超時。
```
--detach
```
脫離外殼。意味著--sloglog。
```
--pid-file=<file>
```
將進程ID保存在_文件_中。守護程序在`--inetd`下運行時忽略。
```
--user=<user>
```
```
--group=<group>
```
在進入服務循環之前更改守護進程的uid和gid。如果僅在沒有`--group`的情況下給出`--user`,則使用用戶的主要組ID。選項的值賦予`getpwnam(3)`和`getgrnam(3)`,不支持數字ID。
與`--inetd`一起使用時,給出這些選項是錯誤的;如果需要,在產生 _git守護程序_之前使用inet守護程序的功能來實現相同的功能。
與許多切換用戶ID的程序一樣,守護程序在運行git程序時不會重置諸如`$HOME`之類的環境變量,例如`upload-pack`和`receive-pack`。使用此選項時,您可能還需要在啟動守護程序之前將`HOME`設置并導出到`<user>`的主目錄,并確保`<user>`可讀取該目錄中的任何Git配置文件。
```
--enable=<service>
```
```
--disable=<service>
```
默認情況下在站點范圍內啟用/禁用服務。請注意,如果某個服務器標記為可覆蓋,并且存儲庫通過配置項啟用該服務,則仍可以為每個存儲庫啟用站點范圍內禁用的服務。
```
--allow-override=<service>
```
```
--forbid-override=<service>
```
允許/禁止使用每個存儲庫配置覆蓋站點范圍的默認值。默認情況下,可以覆蓋所有服務。
```
--[no-]informative-errors
```
當打開信息性錯誤時,git-daemon將向客戶端報告更詳細的錯誤,將“no such repository”等條件與“未導出的存儲庫”區分開來。這對客戶來說更方便,但可能會泄漏有關未導出存儲庫存在的信息。如果未啟用信息性錯誤,則所有錯誤都會向客戶端報告“拒絕訪問”。默認值為--no-informative-errors。
```
--access-hook=<path>
```
每次客戶端連接時,首先運行由< path>指定的外部命令。具有服務名稱(例如“upload-pack”),存儲庫的路徑,主機名(%H),規范主機名(%CH),IP地址(%IP)和TCP端口(%P)作為其命令行參數。外部命令可以通過退出非零狀態(或通過以零狀態退出來允許它)來決定拒絕服務。在做出此決定時,它還可以查看$ REMOTE_ADDR和`$REMOTE_PORT`環境變量以了解請求者。
外部命令可以選擇將單行寫入其標準輸出,以便在拒絕服務時將其作為錯誤消息發送給請求者。
```
<directory>
```
要添加到允許目錄的白名單的目錄。除非指定了--strict-paths,否則這還將包括每個命名目錄的子目錄。
## 服務
可以使用此命令的命令行選項全局啟用/禁用這些服務。如果需要更細粒度的控制(例如,允許 _git archive_ 僅在守護程序所服務的幾個選定的存儲庫中運行),則每個存儲庫配置文件可用于啟用或禁用它們。
```
upload-pack
```
這服務于 _git fetch-pack_ 和 _git ls-remote_ 客戶端。它默認啟用,但存儲庫可以通過將`daemon.uploadpack`配置項設置為`false`來禁用它。
```
upload-archive
```
這服務 _git archive --remote_ 。默認情況下禁用它,但存儲庫可以通過將`daemon.uploadarch`配置項設置為`true`來啟用它。
```
receive-pack
```
這為 _git send-pack_ 客戶端提供服務,允許匿名推送。它默認是禁用的,因為協議中有_沒有_身份驗證(換句話說,任何人都可以將任何內容推送到存儲庫中,包括刪除引用)。這僅適用于每個人都很友好的封閉式LAN環境。可以通過將`daemon.receivepack`配置項設置為`true`來啟用此服務。
## 例子
```
We assume the following in /etc/services
```
```
$ grep 9418 /etc/services
git 9418/tcp # Git Version Control System
```
```
git daemon as inetd server
```
要將 _git守護程序_設置為處理列入白名單的目錄集/ pub / foo和/ pub / bar下的任何存儲庫的ine??td服務,請將以下條目放入/ etc / inetd all in one線:
```
git stream tcp nowait nobody /usr/bin/git
git daemon --inetd --verbose --export-all
/pub/foo /pub/bar
```
```
git daemon as inetd server for virtual hosts
```
要將 _git守護程序_設置為處理不同虛擬主機`www.example.com`和`www.example.org`的存儲庫的ine??td服務,請在`/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 as regular daemon for virtual hosts
```
要將 _git守護程序_設置為常規的非inetd服務,根據其IP地址處理多個虛擬主機的存儲庫,請啟動守護程序,如下所示:
```
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地址。
```
selectively enable/disable services per repository
```
要啟用 _git archive --remote_ 并禁用存儲庫中的 _git fetch_ ,請在存儲庫的配置文件中保存以下內容(即文件 _config_ next到`HEAD`, _refs_ 和_對象_)。
```
[daemon]
uploadpack = false
uploadarch = true
```
## 環境
如果IP地址可用, _git守護程序_會將REMOTE_ADDR設置為與其連接的客戶端的IP地址。 REMOTE_ADDR將在執行服務時調用的掛鉤環境中可用。
## GIT
部分 [git [1]](https://git-scm.com/docs/git) 套件
- git
- git-config
- git-help
- git-init
- git-clone
- git-add
- git-status
- git-diff
- git-commit
- git-reset
- git-rm
- git-mv
- git-branch
- git-checkout
- git-merge
- git-mergetool
- git-log
- git-stash
- git-tag
- git-worktree
- git-fetch
- git-pull
- git-push
- git-remote
- git-submodule
- git-show
- git-log
- git-shortlog
- git-describe
- git-apply
- git-cherry-pick
- git-rebase
- git-revert
- git-bisect
- git-blame
- git-grep
- gitattributes
- giteveryday
- gitglossary
- githooks
- gitignore
- gitmodules
- gitrevisions
- gittutorial
- gitworkflows
- git-am
- git-format-patch
- git-send-email
- git-request-pull
- git-svn
- git-fast-import
- git-clean
- git-gc
- git-fsck
- git-reflog
- git-filter-branch
- git-instaweb
- git-archive
- git-bundle
- git-daemon
- git-update-server-info
- git-cat-file
- git-check-ignore
- git-checkout-index
- git-commit-tree
- git-count-objects
- git-diff-index
- git-for-each-ref
- git-hash-object
- git-ls-files
- git-merge-base
- git-read-tree
- git-rev-list
- git-rev-parse
- git-show-ref
- git-symbolic-ref
- git-update-index
- git-update-ref
- git-verify-pack
- git-write-tree