【问题标题】:Creating a git pre-receive hook创建一个 git 预接收钩子
【发布时间】:2016-10-14 09:22:16
【问题描述】:

序幕

我想从我的pre-push hook 创建一个pre-receive hook。现在,环顾“网络”和“SO”,我发现了许多与特定问题有关的问题,和/或专注于对钩子的描述,而不是实际展示它(我在看着你,git-scm)。

要点

无论如何,据我所知,pre-receive hook 是在 无参数 的情况下调用的。那我如何获取数据呢?有很多数据我会看到自己想在这样的钩子中获得,例如:

  • pushername(请原谅双关语)
  • 提交信息
  • 时间戳
  • 更改的文件
  • 目标分支

但老实说,我不知道如何获取数据 - 我知道人们会这样做,因为我已经看到了这样的脚本。

假设

我想假设它是bash-doable,因为配置越少越好,amirite?

实际问题

编写一个预接收钩子,如何收集触发它的推送数据?

【问题讨论】:

    标签: linux git bash


    【解决方案1】:

    这已记录在案,请参阅https://git-scm.com/docs/githooks#pre-receive

    这个钩子为接收操作执行一次。它不需要 参数,但是对于每个要更新的 ref,它都按标准接收 输入一行格式:

    <old-value> SP <new-value> SP <ref-name> LF
    

    &lt;old-value&gt; 是存储在 ref 中的旧对象名称, &lt;new-value&gt; 是要存储在 ref 中的新对象名称,并且 &lt;ref-name&gt; 是参考的全名。创建新的参考时, &lt;old-value&gt; 是 40 0。

    请注意,您可以接收多个分支的更新。当你在 bash 中编写你的 pre-receive 钩子时,你可以从:

    while read old new ref; do
        # do something with each $old $new $ref
    done
    

    $ref 将是全名,例如refs/heads/my-branch$old$new 是提交对象的 SHA-1 名称。

    要获取提交消息、作者等,您可以使用$old$new 调用git 命令,例如git log $old..$new(请注意,一个分支上可能会推送多个新提交)。

    【讨论】:

    • 我能以某种方式获得推送者用户名吗?我看到 git log 让我可以访问作者、电子邮件,但如果我对实际提交不感兴趣,而是将提交带到存储库的过程怎么办?
    • @MatthewBlackwind:Git 不知道谁运行git push,一般来说。您正在某个服务器上运行,并且有人连接到您并说“在这里,有一些提交”。谁与您联系,您怎么知道? Git 不在乎,它将身份验证留给正在运行的git receive-pack。注意 ssh 和 https 做认证; ssh 设置了一些环境变量; git push --signed 添加一个签名 blob,git receive-pack 用 env 变量标记:kernel.org/pub/software/scm/git/docs/git-receive-pack.html
    【解决方案2】:

    您需要从标准输入读取。每行都为您提供旧参考、新参考和参考名称。可以在Git pre-receive hook 找到一个起始示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-04
      • 2020-10-09
      • 2012-02-24
      • 2014-10-15
      • 2012-01-03
      • 2011-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多