如何在一个 git 命令中删除任何这些远程标签?

How can I delete any of those remote tags in one git command?

上下文

我有一个持续集成设置,我们通过添加标签 patchminormajor 来触发部署。 在每种情况下,我的发布脚本都会触发这些标签,生成适当的新版本号并发布库。

问题

库发布后,我想确保 none 这些标签保留在遥控器上。 我知道我可以做到以下几点:

git push origin :patch; git push origin :minor ; git push origin :major;

但这效率很低,因为它需要三个连接而不是一个。

我尝试使用 git push origin --delete patch minor major,但如果未找到三个标签,则该命令不会删除任何标签:

git push origin --delete minor major patch
error: unable to delete 'patch': remote ref does not exist
error: failed to push some refs to 'git@github.com:algolia/algoliasearch-client-android.git'
# You can see none was deleted, as if I try again on the existing ones:
[algoliasearch-client-android] git push origin --delete minor major      
To github.com:algolia/algoliasearch-client-android.git
 - [deleted]         minor
 - [deleted]         major

我认为这是特定于 git push/remote 标签的,因为我可以在本地执行:

git tag --delete minor major patch
Deleted tag 'minor' (was db08908)
Deleted tag 'major' (was db08908)
error: tag 'patch' not found.

有没有办法在一个命令中删除多个远程标签中的任何一个?

首先,虽然与答案没有直接关系,但重要的是要记住 Git 没有 远程标签 。 Git 只有标签。你用 git push 做的是让 你的 Git 调用一些 other Git,然后要求 other Git 更改其部分引用。

其他 Git 的引用根本不是 远程 。他们只是参考!如果它们以 refs/tags/ 开头,则它们是特定类型的引用,即标记名称。 (所有完全限定的名称都以 refs/ 开头;refs/ 之后的几个字符决定了这是什么 种类 。)

git push origin --delete a b c 让你的 Git 要求他们 Git 删除 不合格的引用: 你的 Git 不知道是否这些是 branch 名称,tag 名称,或其他完全不同的名称。所以你的 Git 和他们的 Git 必须协调并解决这个问题。如果他们 没有 其中之一,您的 Git 会告诉您,您的两个 Git 无法就这些都是什么达成一致,并且确实如此none 个。

但您可以提供完全限定的参考名称:git push origin --delete refs/tags/a refs/tags/b refs/tags/c。现在你的 Git 确定了你要问他们的意思,所以它只是要求他们删除 他们的 refs/tags/a、他们的 refs/tags/b 和他们的 refs/tags/c。他们的 Git 通过自己的验证来运行这些请求——即,你可以这样做吗?——默认答案始终是 "yes"。他们的 Git 将回复 "OK, deleted" 或 "I don't know that reference",您可以选择其中任何一个答案。

您可以使用 jsageryd's answer 中提到的其他语法来执行此操作,这是一种不同的语法:

git push origin :refs/tags/a :refs/tags/b :refs/tags/c

例如;所使用的语法并不是很重要,除非您想将一些创建或更新请求与一些删除请求一起推送(--delete 适用于您提供的所有引用)。 --atomic标志,如果你使用它,相关的,但默认实际上是--no-atomic