git-receive-pack
接收推送到仓库的内容。
概要
'git receive-pack' <git-dir>描述
由 git send-pack 调用,并使用从远程端提供的信息更新仓库。
此命令通常不由最终用户直接调用。该协议的 UI 在 git send-pack 端,程序对旨在用于将更新推送到远程仓库。有关拉取操作,请参阅 git-fetch-pack(1)。
该命令允许在远程端创建和快进 sha1 引用(头/标签)(严格来说,它是 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请求。--skip-connectivity-check:绕过验证可传递闭包中所有对象存在性的连接性检查。此选项适用于希望在 Git 之外实现自己的对象连接性验证的服务器运营商。
预接收钩子
在更新任何引用之前,如果 $GIT_DIR/hooks/pre-receive 文件存在且可执行,它将被调用一次,不带参数。钩子的标准输入是每行一个要更新的引用:
sha1-old SP sha1-new SP refname LFrefname 值是相对于 $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 查询其对象名称。
GIT_PUSH_CERT_SIGNER:签署推送证书的密钥所有者的姓名和电子邮件地址。GIT_PUSH_CERT_KEY:签署推送证书的密钥的 GPG 密钥 ID。GIT_PUSH_CERT_STATUS:推送证书的 GPG 验证状态。GIT_PUSH_CERT_NONCE:进程要求签名者包含在推送证书中的 nonce 字符串。GIT_PUSH_CERT_NONCE_STATUS:nonce 验证状态(UNSOLICITED、MISSING、BAD、OK、SLOP)。GIT_PUSH_CERT_NONCE_SLOP:nonce 时间偏差(秒)。
更新钩子
在更新每个引用之前,如果 $GIT_DIR/hooks/update 文件存在且可执行,它将为每个引用调用一次,带有三个参数:
$GIT_DIR/hooks/update refname sha1-old sha1-new如果钩子以非零状态退出,则应不允许更新命名的引用。否则应以零退出。
此钩子的成功执行(零退出状态)并不确保引用实际上会被更新,它只是一个前提条件。因此,从此钩子发送通知(例如电子邮件)不是一个好主意。考虑改用 post-receive 钩子。
接收后钩子
在所有引用被更新(或尝试更新)后,如果任何引用更新成功,并且 $GIT_DIR/hooks/post-receive 文件存在且可执行,它将被调用一次,不带参数。钩子的标准输入是每个成功更新的引用一行:
sha1-old SP sha1-new SP refname LF更新后钩子
在所有其他处理之后,如果至少更新了一个引用,并且 $GIT_DIR/hooks/post-update 文件存在且可执行,则 post-update 将使用已更新的引用列表调用。这可用于实现任何仓库范围的清理任务。
此钩子可用于,例如,如果仓库已打包并通过 dumb 传输提供服务,则运行 git update-server-info。
隔离环境
当 receive-pack 接收对象时,它们被放置在 $GIT_DIR/objects 目录中的临时"隔离"目录中,并且仅在 pre-receive 钩子完成后才迁移到主对象存储中。如果推送在此之前失败,临时目录将被完全删除。
这有一些用户可见的影响和注意事项:
- 由于传入包的问题、缺少对象或由于
pre-receive钩子而失败的推送不会在磁盘上留下任何数据。 pre-receive钩子创建的任何对象将在隔离目录中创建(并且仅在成功时迁移)。pre-receive钩子不得更新任何引用以指向隔离的对象。
另请参阅
git-send-pack(1), gitnamespaces(7)
Git
git 套件的一部分
