我该如何在git钩子中响应新标签?

36
我想设置一个Git Hook,基于接收到的标签创建CDN风格的目录结构。例如,如果本地仓库中最新的标签是“v1.2.1”,并且我拉取了一个带有“v1.2.2”的提交,则应该看到新标签,并相应地将仓库克隆到新目录(../1.2.2)中。
我很确定要将其附加到post-receive上,但是在Git Hooks文档中找不到有关如何读取传入标签的任何信息。它们通过不同的挂钩传递吗?实际上是否需要运行git命令来查看是否有任何新提交具有新标签?
谢谢!
1个回答

38

标签就像其他引用(例如提交)一样。
如果使用 post-receive 钩子将标签推送到存储库中,该钩子将被调用并列出所有已更新的引用,即旧值和新值以及它们的名称(在其标准输入上)。

请参见此服务器 post-receive 邮件 钩子示例。

#!/bin/bash

. $(dirname $0)/functions

process_ref() {
    oldrev=$(git rev-parse $1)
    newrev=$(git rev-parse $2)
    refname="$3"

    set_change_type
    set_rev_types
    set_describe_tags

    case "$refname","$rev_type" in
      refs/tags/*,tag)
        # annotated tag
        refname_type="annotated tag"
        function="atag"
        short_refname=${refname##refs/tags/}
        # change recipients
        if [ -n "$announcerecipients" ]; then
          recipients="$announcerecipients"
        fi
      ;;
    esac 
}

while read REF; do process_ref $REF; done

为了使其正常工作,您还必须安装来自上述示例挂钩存储库的函数文件


当我推送标签时,“$1,$2和$3” 对我来说都是空的。 - chovy
1
我修复了答案中的示例,使其成为一个完整的Bash脚本,适用于像我这样懒得跟随post-receive链接的人。 - Joshua Clayton
1
需要注意的是,并非所有的git仓库都会发送post-receive消息。要在Atlassian Stash中执行post-receive hook,您需要做更多的工作。 - jcollum
${refname##refs/tags/}”难道不是Bash特有的操作吗?如果是这样的话,应该使用#!/bin/bash作为shebang以避免系统将/bin/sh链接到其他shell(例如dash)而引起问题。 - Steen Schütt
1
@SteenSchütt 我同意,并已编辑了这个(8年前的)答案。 - VonC
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接