如何删除远程标签?

如何删除已经推送的 Git 标签?

答案

您只需要将 “空” 引用推送到远程标记名称:

git push origin :tagname

或者,更具表现力的是使用--delete选项(如果 git 版本低于 1.8.0,则为-d ):

git push --delete origin tagname

请注意,git 具有标签名称空间和分支名称空间,因此您可以对分支和标签使用相同的名称。如果要确保不会意外删除分支而不是标签,则可以指定完整引用,它绝不会删除分支:

git push origin :refs/tags/tagname

如果还需要删除本地标签,请使用:

git tag --delete tagname

背景

将分支,标记或其他引用推送到远程存储库涉及指定 “哪个存储库,哪个源,哪个目标?”。

git push remote-repo source-ref:destination-ref

一个真实的示例,其中您将 master 分支推到原点的 master 分支是:

git push origin refs/heads/master:refs/heads/master

由于默认路径,可以将其缩短为:

git push origin master:master

标签的工作方式相同:

git push origin refs/tags/release-1.0:refs/tags/release-1.0

也可以缩短为:

git push origin release-1.0:release-1.0

通过省略源引用(冒号之前的部分),将 “无” 推到目标,删除远程端的引用。

一种更直接的方法是

git push --delete origin YOUR_TAG_NAME

在这种情况下,IMO 前缀冒号语法有点奇怪

如果您有要删除的远程标记v0.1.0 ,并且您的远程标记是origin ,则只需:

git push origin :refs/tags/v0.1.0

如果还需要在本地删除标签:

git tag -d v0.1.0

请参阅Adam Franco的答案 ,以获取有关 Git 不寻常的解释:删除语法。

删除所有本地标签并获取远程标签列表

git tag -l | xargs git tag -d
git fetch

删除所有远程标签

git tag -l | xargs -n 1 git push --delete origin

清理本地标签

git tag -l | xargs git tag -d

要从远程存储库中删除标签:

git push --delete origin TAGNAME

您可能还想在本地删除标签:

git tag -d TAGNAME

在您的终端上,执行以下操作:

git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}

现在去 Github.com 刷新,它们消失了。

git tag -d your_tag_name
git push origin :refs/tags/your_tag_name

第一行从本地存储库中删除your_tag_name ,第二行从远程存储库中删除它。现在 your_tag 已从本地和远程回购中完全删除,但是有时您可能需要删除由 GitHub 在发行版中手动起草的已删除标签。

删除本地标签 “12345”

git tag -d 12345

删除远程标签 “12345”(例如;也是 GitHub 版本)

git push origin :refs/tags/12345

替代方法

git push --delete origin tagName
git tag -d tagName

在此处输入图片说明

请注意,如果您有一个名为 remote tag 的远程分支,则这些命令是不明确的:

git push origin :tagname
git push --delete origin tagname

因此,您必须使用以下命令删除标签:

git push origin :refs/tags/<tag>

而这个删除分支:

git push origin :refs/heads/<branch>

如果没有,您将得到如下错误:

error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'

数千种远程标签的处理速度提高了 100 倍

在阅读完这些答案并需要删除超过 11,000 个标签之后,我了解到依赖这些方法或xargs花费的时间太长,除非您需要花费数小时进行刻录。

挣扎,我发现了两个更快的方式。对于这两种方法,请从git taggit ls-remote --tags ,以列出要在远程上删除的标签的列表。在下面的例子中,你可以省略或代替sorting_proccessing_etc任何grep ING, sort ING, tail ING 或head荷兰国际集团想要( grep -P "my_regex" | sort | head -n -200 ):


到目前为止,第一种方法最快,比使用xargs20 至 100 倍 ,并且一次至少可以处理数千个标签。

git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh

这是如何运作的?普通的,行分隔的标签列表将转换为一行以空格分隔的标签,每个标签前面都带有: so。 。 。

tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

git push与该 format 标签一起使用不会任何内容推送到每个远程引用中,从而将其删除(以这种方式推送的常规格式是local_ref_path:remote_ref_path )。

方法 2 分解为同一页上其他位置的单独答案


在这两种方法之后,您可能还希望删除本地标签。这要快得多,所以我们可以回到使用xargsgit tag -d ,这已经足够了。

git tag | sorting_processing_etc | xargs -L 1 git tag -d

或类似于远程删除:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")