如何推送所有已注释的标签?

4
如何将本地仓库中的所有已注释标签推送到远程仓库,而不推送轻量级标签?
我在本地使用轻量级标签,不想被推送,因此git push --tags不是解决方案。
我知道可以使用git push --follow-tags,但这只会推送与当前正在推送的提交相关联的标签。
我需要这个选项,因为我的正常工作流程包括不时地推送,但只有在完成发布时才打标签,有时我会忘记推送标签。这个问题经常长时间不被发现,并且会导致其他开发者混淆,因为我们的标签不同步。
由于列出本地存在但远程不存在的已注释标签很复杂,因此我希望通过推送所有本地已注释的标签来解决此问题,这将确保所有开发者的本地和远程仓库具有相同的已注释标签。
2个回答

5

这不是太难。首先找到所有已注释的标签(拒绝直接指向提交而不是已注释标签对象的标签)。这可能有点冗长,因此您可能希望将其编写为shell函数:

list_annotated_tags() {
    git for-each-ref --format '%(objecttype) %(refname)' refs/tags |
        while read reftype refname; do
            case $reftype in tag) echo $refname;; esac
        done
}

阅读上述内容的输出,并将其用作git push命令的refspec参数:

git push origin $(list_annotated_tags)

并且您的脚本已经完成。


1

我注意到我的轻量级标签不包括taggerdate。在这种情况下,以下命令行或脚本将起作用:

taglist=`git for-each-ref refs/tags --format '%(refname:short) %09 %(taggerdate:short)' | \
grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}' | \
cut -f 1 | \
tr '\n' ' '`

跟随着:

git push origin $taglist
< p >以下是命令摘要(供有兴趣的人参考):< /p >
  • 第一行 - 检索格式化为显示标签名称、制表符和日期的git for-each-ref标签列表。(只有带注释的标签才有日期。)
  • 第二行 - grep命令搜索第一个命令的结果,仅提取具有日期的那些标签。
  • 第三行 - cut命令删除初始列后的所有内容(即从每个标签名称后面的制表符到结束每个结果行的newline之前)。
  • 第四行 - tr命令将末尾结果中的newline替换为一个空格。(现在,标签名称在一行上,用空格分隔。)

结果存储在一个变量中(taglist - 请注意,在taglist=后面跟随整个命令集的反引号)。

最后,您将标签列表推送到源(使用$表示taglist是一个变量)。


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