我有一个持续集成设置,我们通过添加标记patch
,minor
或major
来触发部署。
在每种情况下,我的发布脚本都会触发这些标记,生成适当的新版本号并释放库。
库发布后,我想确保遥控器上没有这些标签。 我知道我可以做到以下几点:
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.
答案 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
。