如何在一个 git 命令中删除任何这些远程标签?
How can I delete any of those remote tags in one git command?
上下文
我有一个持续集成设置,我们通过添加标签 patch
、minor
或 major
来触发部署。
在每种情况下,我的发布脚本都会触发这些标签,生成适当的新版本号并发布库。
问题
库发布后,我想确保 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
。
上下文
我有一个持续集成设置,我们通过添加标签 patch
、minor
或 major
来触发部署。
在每种情况下,我的发布脚本都会触发这些标签,生成适当的新版本号并发布库。
问题
库发布后,我想确保 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
。