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

时间:2017-05-15 01:55:28

标签: git git-push git-tag

如何在不推送轻量级标签的情况下将所有带注释的标签从我的本地仓库推送到遥控器?

我在本地使用我不想推送的轻量级标签,因此git push --tags不是解决方案。

我知道git push --follow-tags,但这只会推送与当前正在推送的提交相关联的标记。

我需要这个选项,因为我的正常工作流程涉及不时推送,但只在最终确定版本时进行标记,而我有时会忘记推送标签。这个问题经常在很长一段时间内未被发现,并且与其他开发人员产生一些混淆,因为我们与我们的标签不同步。

由于列出哪些带注释的标签存在于本地但不是远程,这很复杂,我想通过推送所有本地带注释的标签来解决这个问题,这将确保所有开发人员和# 39;本地和远程repos具有相同的注释标记。

2 个答案:

答案 0 :(得分:4)

这并不太难。首先找到所有带注释的标签(通过拒绝直接指向提交而不是带注释的标签对象的标签)。这有点长,所以你可能希望把它写成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 :(得分: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

命令摘要,适用于任何有兴趣的人

  • 第1行 - 检索git for-each-ref标记列表,格式化以显示标记名,选项卡和日期。 (只有带注释的标签才会有日期。)
  • 第二行 - grep命令搜索第一个命令的结果,仅提取带有日期的标签。
  • 第3行 - cut命令删除初始列之后的所有内容(即,从每个标记名后面的选项卡之前到结束每个结果行的newline)。
  • 第4行 - tr命令用最终结果中的空格替换newline。 (标记名现在在一行上,用空格分隔。)

结果存储在变量(taglist中 - 注意taglist=后整个命令集开头和结尾的反引号。

最后,您将标记列表推送到原点(使用$表示taglist是变量)。