35

我想设置一个基于传入标签创建 CDN 样式目录结构的 git 挂钩。因此,例如,如果本地存储库中的最后一个标签是“v1.2.1”并且我使用“v1.2.2”拉取提交,它应该会看到新标签并将存储库直接克隆到新标签(../1.2 .2) 相应地。

我很确定我想将它附加到 post-receive,但是我在文档中找不到任何关于如何读取传入标签的 git hooks 的内容。他们是在不同的钩子上交付的吗?我真的需要让 shell 脚本运行一个 git 命令来查看是否有任何新提交有新标签吗?

谢谢!

4

1 回答 1

37

标签与任何其他(如提交)一样是参考。
如果标签被推送到带有post-receive 钩子的仓库,该钩子将被调用并列出所有更新的 refs,即所有 refs 的旧值和新值以及它们的名称(在其标准输入上)。

例如,请参阅此服务器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

为此,您还必须从上述示例挂钩存储库中安装函数文件。

于 2011-04-27T20:58:00.093 回答