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

M.M*_*M.M 4 git git-push git-tag

如何将所有带注释的标签从本地存储库推送到远程,而不推送轻量级标签?

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

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

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

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

tor*_*rek 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
}
Run Code Online (Sandbox Code Playgroud)

读取上面的输出并将它们用作命令的 refspec 参数git push

git push origin $(list_annotated_tags)
Run Code Online (Sandbox Code Playgroud)

您的脚本已完成。