?
This document uses PHP Chinese website manual Release
git-receive-pack - 接收推入存儲庫的內(nèi)容
git-receive-pack <directory>
git send-pack
使用從遠(yuǎn)程端提供的信息調(diào)用并更新存儲庫。
該命令通常不由最終用戶直接調(diào)用。該協(xié)議的用戶界面位于git send-pack
側(cè)面,程序?qū)χ荚谟糜趯⒏峦扑偷竭h(yuǎn)程存儲庫。對于拉操作,請參閱git-fetch-pack。
該命令允許在遠(yuǎn)端創(chuàng)建和快速轉(zhuǎn)發(fā)sha1 refs(heads/tags)(嚴(yán)格來說,這是本地最終git-receive-pack
運(yùn)行,但對于坐在發(fā)送包端的用戶,它正在更新遙遠(yuǎn)的。)
在Documentation/howto目錄中還有其他一些使用update和post-update鉤子的真實(shí)例子。
git-receive-pack
尊重receive.denyNonFastForwards配置選項(xiàng),該選項(xiàng)告訴它是否應(yīng)該拒絕對ref的更新,如果它們不是快進(jìn)的。
其他一些receive.* config選項(xiàng)可用于調(diào)整其行為,請參閱git-config。
<directory>
要同步到的存儲庫。
在任何ref被更新之前,如果$ GIT_DIR/hooks/pre-receive文件存在并且是可執(zhí)行文件,它將被調(diào)用一次而沒有參數(shù)。鉤子的標(biāo)準(zhǔn)輸入將被更新為每個參考線一行:
sha1-old SP sha1-new SP refname LF
refname的值是相對于$ GIT_DIR; 例如,對于主人的頭,這是“裁判/頭/主人”。每個refname前的兩個sha1值是更新之前和之后的refname的對象名稱。要創(chuàng)建的引用將具有等于0 {40}的sha1,而要刪除的引用將具有等于0 {40}的sha1-new,否則sha1-old和sha1-new應(yīng)該是存儲庫中的有效對象。
當(dāng)接受一個簽名推送(參見git-push [1])時,簽名推送證書存儲在一個blob中,并且GIT_PUSH_CERT
可以查詢其對象名稱的環(huán)境變量。有關(guān)post-receive
示例,請參閱hook的說明。另外,使用GPG驗(yàn)證證書,并使用以下環(huán)境變量導(dǎo)出結(jié)果:
GIT_PUSH_CERT_SIGNER
簽名推送證書的密鑰所有者的名稱和電子郵件地址。
GIT_PUSH_CERT_KEY
簽署推送證書的密鑰的GPG密鑰ID。
GIT_PUSH_CERT_STATUS
GPG驗(yàn)證推送證書的狀態(tài),使用與命令系列%G?
格式相同的助記符git log
(請參閱git-log)。
GIT_PUSH_CERT_NONCE
進(jìn)程要求簽名者將其包含在推送證書中的隨機(jī)數(shù)字符串。如果這與推送證書中的“隨機(jī)數(shù)”頭中記錄的值不匹配,則可能表明證書是從單獨(dú)的“git推送”會話重播的有效證書。
GIT_PUSH_CERT_NONCE_STATUS
UNSOLICITED
當(dāng)我們沒有要求它發(fā)送一個時,“git push --signed”發(fā)送了一個隨機(jī)數(shù)。
MISSING
“git push --signed”沒有發(fā)送任何隨機(jī)頭。
BAD
“git push -signed”發(fā)送了一個偽造的隨機(jī)數(shù)。
OK
“git push --signed”發(fā)送了我們要求它發(fā)送的隨機(jī)數(shù)。
SLOP
“git push --signed”發(fā)送了一個與我們現(xiàn)在要求它發(fā)送的不同,但是在之前的會話中。查看GIT_PUSH_CERT_NONCE_SLOP
環(huán)境變量。
GIT_PUSH_CERT_NONCE_SLOP
“git push --signed”發(fā)送了一個與我們要求它現(xiàn)在發(fā)送的不同的隨機(jī)數(shù),但是在一個不同的會話中,其起始時間與當(dāng)前會話相差很多秒。只有在GIT_PUSH_CERT_NONCE_STATUS
說時才有意義SLOP
。receive.certNonceSlop
在git-config中閱讀有關(guān)變量。
在更新任何refname之前和執(zhí)行任何快進(jìn)檢查之前調(diào)用此鉤子。
如果預(yù)接收hook以非零退出狀態(tài)退出,則不會執(zhí)行更新,更新,接收后和更新后鉤子也不會被調(diào)用。如果更新不被支持,這可以快速救助。
請參閱下面的隔離環(huán)境注意事項(xiàng)。
在更新每個ref之前,如果$ GIT_DIR/hooks/update文件存在并且是可執(zhí)行文件,則每個ref都會調(diào)用一次,其中包含三個參數(shù):
$GIT_DIR/hooks/update refname sha1-old sha1-new
refname參數(shù)是相對于$ GIT_DIR; 例如,對于主人的頭,這是“refs/heads/master”。這兩個sha1參數(shù)是更新之前和之后refname的對象名稱。請注意,鉤子在更新refname之前被調(diào)用,所以sha1-old是0 {40}(意味著還沒有這樣的ref),或者它應(yīng)該匹配在refname中記錄的內(nèi)容。
如果要禁止更新指定的參考值,則hook應(yīng)該以非零狀態(tài)退出。否則它應(yīng)該以零退出。
hook的成功執(zhí)行(零退出狀態(tài))并不能確保引用實(shí)際上會被更新,它只是一個先決條件。因此,從這個hook發(fā)送通知(例如電子郵件)并不是一個好主意??紤]使用post-receive hook來代替。
在所有ref被更新(或試圖更新)之后,如果任何ref更新成功,并且$ GIT_DIR/hooks/post-receive文件存在并且是可執(zhí)行文件,則它將被調(diào)用一次而沒有參數(shù)。鉤子的標(biāo)準(zhǔn)輸入對于每個成功更新的ref都是一行:
sha1-old SP sha1-new SP refname LF
refname的值是相對于$ GIT_DIR; 例如,對于主人的頭,這是“refs/heads/master”。每個refname前的兩個sha1值是更新之前和之后的refname的對象名稱。創(chuàng)建的Ref將具有等于0 {40}的sha1等號,而被刪除的ref將具有等于0 {40}的sha1-new,否則sha1-old和sha1-new應(yīng)該是存儲庫中的有效對象。
在GIT_PUSH_CERT*
環(huán)境變量可以被檢查,就如同在pre-receive
hook,接受簽字推后。
使用這個hook,很容易生成描述存儲庫更新的郵件。此示例腳本每次發(fā)送一條郵件消息,列出推送到存儲庫的提交,并將具有良好簽名的簽名推送推送證書記錄到記錄器服務(wù):
#!/bin/sh # mail out commit update information.while read oval nval refdo 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 anyif test -n "${GIT_PUSH_CERT-}" && test ${GIT_PUSH_CERT_STATUS} = Gthen ( 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
此hook調(diào)用的退出代碼將被忽略,但非零退出代碼將生成錯誤消息。
請注意,當(dāng)此hook運(yùn)行時,refname可能不會有sha1-new。如果其他用戶在更新后修改了ref git-receive-pack
,但在鉤子能夠評估之前,這很容易發(fā)生。建議鉤子依賴于sha1-new而不是refname的當(dāng)前值。
經(jīng)過所有其他處理后,如果至少更新了一個ref,并且$ GIT_DIR/hooks/post-update文件存在并且是可執(zhí)行文件,則更新后將使用已更新的ref列表調(diào)用。這可以用來實(shí)現(xiàn)任何存儲庫范圍的清理任務(wù)。
該hook調(diào)用的退出代碼被忽略;git-receive-pack
無論如何,唯一要做的就是退出。
例如,git update-server-info
如果存儲庫已打包并通過啞傳輸進(jìn)行服務(wù),則可以使用此掛接。
#!/bin/sh exec git update-server-info
當(dāng)receive-pack
接收對象時,它們被放置到目錄中的臨時“隔離”目錄中,$GIT_DIR/objects
并且只有在pre-receive
鉤子完成后才遷移到主對象存儲中。如果在此之前推送失敗,則完全移除臨時目錄。
這有幾個用戶可見的效果和注意事項(xiàng):
推送由于傳入包,缺少對象或pre-receive
掛鉤問題而失敗的內(nèi)容不會留下任何磁盤上的數(shù)據(jù)。這通常有助于防止重復(fù)的失敗推送填滿磁盤,但可能會使調(diào)試更具挑戰(zhàn)性。
pre-receive
掛鉤創(chuàng)建的任何對象都將在隔離目錄中創(chuàng)建(只有在成功時才進(jìn)行遷移)。
該pre-receive
鉤子不得更新任何指向隔離對象的參考。訪問存儲庫的其他程序?qū)o法看到對象(并且如果預(yù)接收掛鉤失敗,則這些引用會損壞)。為了安全起見,任何來自內(nèi)部的ref更新都會pre-receive
被自動拒絕
git-send-pack[1], gitnamespaces[7]