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