我如何应对git钩子中的新标记?

我如何应对git钩子中的新标记?,git,githooks,Git,Githooks,我想设置一个git钩子,它根据传入的标记创建一个CDN风格的目录结构。因此,例如,如果本地存储库中的最后一个标记是“v1.2.1”,并且我使用“v1.2.2”进行提交,那么它应该看到新的标记,并相应地将存储库克隆到新的(../1.2.2)中 我很确定我想把这个附加到post-receive,但是我在文档中找不到关于git-hook的任何关于如何读取传入标记的内容。它们是用不同的钩子运送的吗?我真的需要让shell脚本运行git命令来查看新提交是否有新标记吗 谢谢 标记与任何其他标记(如提交)一样

我想设置一个git钩子,它根据传入的标记创建一个CDN风格的目录结构。因此,例如,如果本地存储库中的最后一个标记是“v1.2.1”,并且我使用“v1.2.2”进行提交,那么它应该看到新的标记,并相应地将存储库克隆到新的(../1.2.2)中

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


谢谢

标记与任何其他标记(如提交)一样是引用。
如果将标记推送到带有的repo,则将调用该钩子并列出所有更新的ref,即所有ref的旧值和新值以及它们的名称(在其标准输入上)

例如,请参见此服务器挂钩

#!/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
在我推送标记时对我来说都是空的。我在答案中修复了示例,因此它是一个完整的bash脚本,对于那些像我这样懒得关注post-receive链接的人来说,需要注意的是,并非所有的git-repo都会发送post-receive消息。要使用Atlassian Stash执行post receive钩子,您需要做更多的工作。@chovy:在原始脚本的这个特定粘贴中缺少了更多的先决条件。遇到类似问题(
$refname
$ref\u type
未定义),遵循原始链接,希望现在就解决。VonC:希望你不介意这段有争议的激烈编辑。@SteenSchütt我同意,我已经编辑了这个(8年前的)答案。