git:仅推送特定标签

22

据我所知,git push --tag 命令会把 refs/tags 下的所有标签推送到远程仓库。我想知道在 git 中是否有一种方法可以只推送与通配符或正则表达式匹配的某些标签?

例如,我的仓库有标签 v1.0v1.1v2.0v2.1。我想只推送 v2.* 标签。我尝试过:

git push <repo> refs/tags/v2.*

并且遇到错误

致命错误:refs/tags/v2.* 的 refspec 远程部分不是有效名称

当然,我总是可以执行

cd .git && ls refs/tags/v2.* | xargs git push <repo>

但这并不令人怀疑。

2个回答

21
git push <remote> tag <tag>

在您的情况下,它将是

git push origin tag v2.*

3
我更喜欢这个简单的解决方案。 - Vincent Jyotirmoy Singha - JS
但它不起作用。 - undefined

16
git tag | grep '^v2\.' | xargs --no-run-if-empty  git push <repo>
  • .git 可能不是目录,它可能根本不存在。子模块有指向根存储库的文件。或者您可以将 GIT_DIR 设置为其他位置。
  • 当没有标签符合您的条件时,您不希望进行推送。

1
如果有一个名为“v2.0”的本地分支,git push如何解决模糊的名称? - Reci
在同一名称下拥有标签和分支是一个不好的想法。Git 无法很好地处理这种情况。请使用 v2.0 作为标签,使用类似于 stable-2.x 的名称作为分支。例如:http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary - Josef Kufner
4
参见 gitrevisions(“当存在歧义时,一个<name>将通过以下规则取第一个匹配项来消除歧义”)。 - Joe
3
标签始终比分支具有优先权。这很重要。Josef,请将此信息添加到您的答案中,我会标记为完成。谢谢! - Reci
3
git tag | grep '^v2\.' 简化为 git tag -l "v2\.*" - CharlesB
这个答案很相关:git push --follow-tags会推送当前分支可达的所有标记,并且是注释类型标记。(git >= 1.8.3)。对于大于2.4版本的git,也可以将其设置为git config的选项。 - JrBenito

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