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

时间:2018-04-13 18:32:17

标签: git git-push git-remote git-tag

上下文

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

问题

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

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.

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

1 个答案:

答案 0 :(得分:2)

首先,虽然与答案没有直接关系,但重要的是要记住Git没有远程标签。 Git只有标签。你在git push做的是你的 Git调用一些其他 Git,然后要求其他 Git更改一些其参考文献。

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

执行git push origin --delete a b c让你的Git要求他们的Git删除不合格的引用:你的Git不知道这些是分支名称, tag < / em>姓名,或完全不同的东西。所以你的Git和他们的Git必须协调并解决这个问题。如果他们没有 其中一个,那么你的Git会告诉你,你的两个Gits无法就这些内容是什么达成一致,并且 none 。< / p>

但您可以提供完全限定的参考名称:git push origin --delete refs/tags/a refs/tags/b refs/tags/c。现在你的Git确定你问他们的意思,所以它只是要求他们删除他们的 refs/tags/a,他们的refs/tags/b和他们的refs/tags/c。他们的Git通过他们自己的验证运行这些请求 - 即,你被允许这样做吗? - 默认答案总是“是”。他们的Git会回复“OK,删除”或“我不知道那个参考”,你会对这些答案中的任何一个都没问题。

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

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

;所使用的语法并不重要,除非您想要推送一些创建或更新请求以及一些删除请求(--delete适用于您提供的所有引用)。 --atomic标记,如果您使用它,则相关,但默认值为--no-atomic