【问题标题】:How to push all annotated tags?如何推送所有带注释的标签?
【发布时间】:2017-10-13 17:03:07
【问题描述】:

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

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

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

我需要这个选项,因为我的正常工作流程涉及不时推送,但仅在完成发布时进行标记,有时我会忘记推送标记。由于我们与标签不同步,因此该问题通常会在很长一段时间内未被发现,并导致与其他开发人员有些混淆。

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

【问题讨论】:

    标签: git git-push git-tag


    【解决方案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
    

    命令摘要,感兴趣的人可以参考

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

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

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

    【讨论】:

      【解决方案2】:

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

      你的脚本就完成了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-14
        • 2014-03-08
        • 2014-11-12
        • 2011-01-18
        • 2020-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多