Skip to content

git-receive-pack

接收推送到仓库的内容。

概要

bash
'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 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 查询其对象名称。

  • 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 钩子完成后才迁移到主对象存储中。如果推送在此之前失败,临时目录将被完全删除。

这有一些用户可见的影响和注意事项:

  1. 由于传入包的问题、缺少对象或由于 pre-receive 钩子而失败的推送不会在磁盘上留下任何数据。
  2. pre-receive 钩子创建的任何对象将在隔离目录中创建(并且仅在成功时迁移)。
  3. pre-receive 钩子不得更新任何引用以指向隔离的对象。

另请参阅

git-send-pack(1), gitnamespaces(7)

Git

git 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布