创建一个git预接收挂钩

时间:2016-10-14 09:22:17

标签: linux git bash

序言

我想从pre-receive hook创建pre-push hook。现在,环顾网络和SO,我发现很多与特定问题有关的问题,和/或专注于钩子的描述,而不是实际显示它(我看着你, GIT-SCM)。

要点

所以无论如何,据我所知,pre-receive hook被称为无参数。那我如何获取数据呢?有很多数据我会发现自己想要抓住这样的钩子,例如:

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

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

假设

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

实际问题

编码预接收挂钩,如何收集有关触发它的推送的数据?

2 个答案:

答案 0 :(得分:1)

记录在案,见https://git-scm.com/docs/githooks#pre-receive

  

此挂钩执行一次以进行接收操作。它不需要   参数,但对于每个ref都要更新它接收标准   输入以下格式的行:

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

其中<old-value>是存储在ref中的旧对象名称,   <new-value>是要存储在ref和中的新对象名   <ref-name>是引用的全名。在创建新的参考时,   <old-value>是40 0。

请注意,您可以接收多个分支的更新。当您在bash中编写预接收挂钩时,可以从:

开始
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(请注意,可能会有多个新提交被推送在一个分支上。)

答案 1 :(得分:1)

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