簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-receive-pack 最後更新於 2.50.0

名稱

git-receive-pack - 接收推送到倉庫的內容

概要

git receive-pack <git-dir>

描述

git send-pack 呼叫,並用來自遠端端的資訊更新倉庫。

此命令通常不直接由終端使用者呼叫。協議的使用者介面在 git send-pack 側,這對程式旨在用於向遠端倉庫推送更新。對於拉取操作,請參閱 git-fetch-pack[1]

此命令允許在遠端端建立和快進 sha1 引用(heads/tags)(嚴格來說,git-receive-pack 在本地端執行,但對於坐在 send-pack 端的使用者而言,它是在更新遠端。感到困惑嗎?)

在 Documentation/howto 目錄中可以找到其他使用 update 和 post-update 鉤子的實際示例。

git-receive-pack 遵循 receive.denyNonFastForwards 配置選項,該選項指示如果對引用的更新不是快進,是否應拒絕它們。

還有許多其他 receive.* 配置選項可用於調整其行為,請參閱 git-config[1]

選項

<git-dir>

要同步到的倉庫。

--http-backend-info-refs

git-http-backend[1] 使用,用於提供 $GIT_URL/info/refs?service=git-receive-pack 請求。請參閱 git-upload-pack[1] 中的 --http-backend-info-refs

--skip-connectivity-check

繞過連線性檢查,該檢查驗證可達物件傳遞閉包中所有物件的存在性。此選項旨在供希望在 Git 之外實現自己的物件連線性驗證的伺服器操作員使用。這在伺服器端了解有關 Git 如何使用的附加資訊,因此可以依靠某些保證來更有效地計算 Git 本身無法進行的連線性的情況下非常有用。在沒有可靠的外部機制來確保完全可達物件連線性的情況下使用此選項可能會損壞倉庫,並且不應在一般情況下使用。

PRE-RECEIVE 鉤子

在更新任何引用之前,如果 $GIT_DIR/hooks/pre-receive 檔案存在且可執行,它將被呼叫一次,不帶任何引數。鉤子的標準輸入將是每行一個要更新的引用。

sha1-old SP sha1-new SP refname LF

refname 值是相對於 $GIT_DIR 的;例如,對於 master 頭,它是 "refs/heads/master"。每個 refname 前的兩個 sha1 值是更新前後 refname 的物件名稱。要建立的引用將具有 sha1-old 等於 0{40},而要刪除的引用將具有 sha1-new 等於 0{40},否則 sha1-old 和 sha1-new 應該是倉庫中有效的物件。

當接受簽名推送(參見 git-push[1])時,簽名推送證書儲存在一個 blob 中,並且可以透過環境變數 GIT_PUSH_CERT 查詢其物件名稱。有關示例,請參閱 post-receive 鉤子的描述。此外,證書使用 GPG 進行驗證,結果透過以下環境變數匯出:

GIT_PUSH_CERT_SIGNER

簽署推送證書的金鑰所有者的名稱和電子郵件地址。

GIT_PUSH_CERT_KEY

簽署推送證書的金鑰的 GPG 金鑰 ID。

GIT_PUSH_CERT_STATUS

推送證書 GPG 驗證的狀態,使用與 git log 系列命令的 %G? 格式中使用的相同的助記符(參見 git-log[1])。

GIT_PUSH_CERT_NONCE

程序要求籤名者包含在推送證書中的 nonce 字串。如果這與推送證書中“nonce”頭中記錄的值不匹配,則可能表明證書是有效證書,但正在從不同的“git push”會話中重放。

GIT_PUSH_CERT_NONCE_STATUS
UNSOLICITED

"git push --signed" 傳送了一個 nonce,而我們沒有要求它傳送。

MISSING

"git push --signed" 沒有傳送任何 nonce 頭。

BAD

"git push --signed" 傳送了一個錯誤的 nonce。

OK

"git push --signed" 傳送了我們要求它傳送的 nonce。

SLOP

"git push --signed" 傳送了一個與我們現在要求它傳送的不同,但在上一個會話中傳送的 nonce。請參閱 GIT_PUSH_CERT_NONCE_SLOP 環境變數。

GIT_PUSH_CERT_NONCE_SLOP

"git push --signed" 傳送了一個與我們現在要求它傳送的不同,但在不同會話中傳送的 nonce,其起始時間與當前會話相差這麼多秒。僅當 GIT_PUSH_CERT_NONCE_STATUS 指示 SLOP 時才有效。另請閱讀 git-config[1] 中的 receive.certNonceSlop 變數。

此鉤子在更新任何 refname 之前以及執行任何快進檢查之前呼叫。

如果 pre-receive 鉤子以非零退出狀態退出,則不會執行任何更新,並且也不會呼叫 update、post-receive 和 post-update 鉤子。如果不支援更新,這對於快速中止非常有用。

請參閱下面關於隔離環境的說明。

UPDATE 鉤子

在更新每個引用之前,如果 $GIT_DIR/hooks/update 檔案存在且可執行,它將為每個引用呼叫一次,帶三個引數:

$GIT_DIR/hooks/update refname sha1-old sha1-new

refname 引數是相對於 $GIT_DIR 的;例如,對於 master 頭,它是 "refs/heads/master"。這兩個 sha1 引數是更新前後 refname 的物件名稱。請注意,鉤子在 refname 更新之前呼叫,因此 sha1-old 要麼是 0{40}(表示尚無此類引用),要麼應與 refname 中記錄的值匹配。

如果鉤子要禁止更新指定引用,則應以非零狀態退出。否則應以零退出。

此鉤子的成功執行(零退出狀態)不保證引用實際會更新,它只是一個先決條件。因此,不建議從此鉤子傳送通知(例如電子郵件)。考慮改用 post-receive 鉤子。

POST-RECEIVE 鉤子

在所有引用更新(或嘗試更新)之後,如果任何引用更新成功,並且如果 $GIT_DIR/hooks/post-receive 檔案存在且可執行,它將不帶任何引數呼叫一次。鉤子的標準輸入將是每個成功更新的引用的一行:

sha1-old SP sha1-new SP refname LF

refname 值是相對於 $GIT_DIR 的;例如,對於 master 頭,它是 "refs/heads/master"。每個 refname 前的兩個 sha1 值是更新前後 refname 的物件名稱。已建立的引用將具有 sha1-old 等於 0{40},而已刪除的引用將具有 sha1-new 等於 0{40},否則 sha1-old 和 sha1-new 應該是倉庫中有效的物件。

接受簽名推送後,可以像在 pre-receive 鉤子中一樣檢查 GIT_PUSH_CERT* 環境變數。

使用此鉤子,可以輕鬆生成描述倉庫更新的郵件。此示例指令碼為每個引用傳送一封郵件,列出推送到倉庫的提交,並將簽名推送的良好籤名推送證書記錄到日誌服務中:

#!/bin/sh
# mail out commit update information.
while read oval nval ref
do
	if expr "$oval" : '0*$' >/dev/null
	then
		echo "Created a new ref, with the following commits:"
		git rev-list --pretty "$nval"
	else
		echo "New commits:"
		git rev-list --pretty "$nval" "^$oval"
	fi |
	mail -s "Changes to ref $ref" commit-list@mydomain
done
# log signed push certificate, if any
if test -n "${GIT_PUSH_CERT-}" && test ${GIT_PUSH_CERT_STATUS} = G
then
	(
		echo expected nonce is ${GIT_PUSH_NONCE}
		git cat-file blob ${GIT_PUSH_CERT}
	) | mail -s "push certificate from $GIT_PUSH_CERT_SIGNER" push-log@mydomain
fi
exit 0

此鉤子呼叫的退出程式碼將被忽略,但是非零退出程式碼將生成錯誤訊息。

請注意,當此鉤子執行時,refname 可能沒有 sha1-new。如果另一個使用者在 git-receive-pack 更新引用後但在鉤子能夠評估它之前修改了引用,則很容易發生這種情況。建議鉤子依賴 sha1-new 而不是 refname 的當前值。

POST-UPDATE 鉤子

在所有其他處理之後,如果至少有一個引用已更新,並且如果 $GIT_DIR/hooks/post-update 檔案存在且可執行,那麼 post-update 將與已更新的引用列表一起呼叫。這可用於實現任何倉庫範圍的清理任務。

此鉤子呼叫的退出程式碼將被忽略;在那時,git-receive-pack 唯一剩下的事情就是自己退出。

例如,如果倉庫已打包並透過 dumb 傳輸提供服務,則此鉤子可用於執行 git update-server-info

#!/bin/sh
exec git update-server-info

隔離環境

receive-pack 接收物件時,它們被放置在 $GIT_DIR/objects 目錄內的臨時“隔離”目錄中,並且僅在 pre-receive 鉤子完成後才遷移到主物件儲存。如果推送在此之前失敗,則臨時目錄將被完全刪除。

這有一些使用者可見的效果和注意事項:

  1. 由於傳入包問題、缺少物件或由於 pre-receive 鉤子而失敗的推送不會在磁碟上留下任何資料。這通常有助於防止重複的失敗推送填滿您的磁碟,但會使除錯更具挑戰性。

  2. pre-receive 鉤子建立的任何物件都將在隔離目錄中建立(並且僅在成功時才遷移)。

  3. pre-receive 鉤子不得更新任何引用以指向隔離物件。訪問倉庫的其他程式將無法看到這些物件(如果 pre-receive 鉤子失敗,這些引用將損壞)。為了安全起見,pre-receive 內的任何引用更新都會自動拒絕。

GIT

Git[1] 套件的一部分

scroll-to-top