如何删除远程标签?

4745

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

29个回答

22

请注意,如果你有一个命名与远程标签相同的远程分支,这些命令就会产生歧义:

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>'

这篇帖子和MeganZhou的回答一样简短明了,解决了我们遇到的问题——分支名和标签名相同。我删除了本地标签并推送到:refs/tags,一切都很好。 - rwheadon

17

删除单个标签:

# Local tag example:
git tag -d v1.0.0

# Remote tag example:
git push -d origin v1.0.0

删除多个标签:

# Local tag example:
git tag -d v1.0.0 v1.1.0

# Remote tag example:
git push -d origin v1.0.0 v1.1.0

删除与特定模式匹配的标签:

# Local tag example:
git tag -d $(git tag -l "*beta*")

# Remote tag example:
git push -d origin $(git tag -l "*beta*")

13

13
如果您使用SourceTree - 一个很棒的Git GUI - 您可以通过以下方式轻松地在不使用命令行的情况下完成此操作:
  1. 在SourceTree中打开您的存储库
  2. 选择并展开左侧的“标签”选项卡
  3. 右键单击要删除的标签
  4. 选择“Delete YOUR_TAG_NAME”
  5. 在确认窗口中,选择“从远程删除标签”
YOUR_TAG_NAME现在将从本地存储库和所有远程存储库中移除 - 不管是GitHub、BitBucket还是其他你列为该存储库的远程位置。
另外,如果您只删除了本地标签但没有删除远程源,则想要在任何地方都删除它,只需创建一个新标签,名称与源相同,并在相同提交处附加。然后,重复上述步骤以删除所有内容。

1
请注意,这是安全的,不会删除任何提交 - 只会删除标签本身。 - Chris Halcrow

13

高达100倍速度的方法,适用于成千上万个远程标签

在需要删除超过11,000个标签时阅读这些回答后,我了解到这些依赖于 xargs 的方法太慢了,除非你有几个小时可以浪费。

经过努力,我找到了两种快得多的方法。对于这两种方法,都要从git taggit ls-remote --tags开始,以列出您想要在远程删除的标签列表。在下面的示例中,您可以省略或替换 sorting_processing_etc 为任何您想要的 grep, sort, tail, 或者 head (例如: grep -P "my_regex" | sort | head -n -200等):


这种第一种方法远远比使用 xargs 快,可能是速度提高了 20 到 100 倍,并且适用于一次删除至少数千个标签。

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

这是如何工作的呢?普通的、每行一个的标签列表将被转换为一个以空格分隔的标签单行,每个标签前面都加上:。所以...

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

使用这种格式标签的git push命令不会将任何内容推送到每个远程引用中,而是删除了它(以这种方式推送的正常格式为local_ref_path:remote_ref_path)。

第二种方法在此页面的其他地方有详细说明


完成这两种方法后,您可能还想删除本地标签。这样做更快,因此我们可以回到使用xargsgit tag -d,这已经足够了。

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

与远程删除类似:

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

你应该将其拆分为几个不同的答案。一行上有多个标签的答案,毫无疑问是批量标记删除的正确答案。实际上,在几乎任何其他地方都很难找到这些信息。即使知道我在寻找什么,我也很难在git帮助页面中找到它 :)因此,向您致敬,并将其作为正确答案突出显示,并将GitHub API移动到其他位置。最后,本地批量删除标记使用空格分隔的标记(去掉冒号)即可。 - CubanX
感谢您的赞扬和建议。我会将其拆分。我不理解您关于本地标签删除的评论。我认为我的最终命令片段没有使用任何冒号,但我正在使用移动设备,可能会漏掉一些东西。 - TonyH
抱歉,我的意思是你用来删除远程标签的方法,同样适用于一次性删除本地标签的整个列表。 :)只需要使用 git tag --delete tag1 tag2 tag3,而不是 git push origin :tag1 :tag2 等等,这样你就可以完全清理了。再次感谢! - CubanX

8
我希望能删除除了符合模式的标签之外的所有标签,以便删除过去几个月以外的所有生产标签,以下是我成功使用的方法: 删除所有远程标签并排除表达式
git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

删除所有本地标签并将表达式从删除中排除

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d

8

正如 @CubanX 建议的那样,我将这个答案从我的原始答案中分离出来:

这是一种比 xargs 快几倍并且可能随着调整而更加扩展的方法。它使用Github API、个人访问令牌并利用实用程序parallel

git tag | sorting_processing_etc | parallel --jobs 2 curl -i -X DELETE \ 
https://api.github.com/repos/My_Account/my_repo/git/refs/tags/{} -H 
\"authorization: token GIT_OAUTH_OR_PERSONAL_KEY_HERE\"  \
-H \"cache-control: no-cache\"`

parallel 有很多操作模式,但通常在允许您设置进程数量限制的同时并行化任何给定的命令。 您可以更改--jobs 2 参数以加快操作速度,但我遇到了Github的速率限制问题,目前为5000 /小时,但也似乎有一个未记录的短期限制。


之后,您可能还想删除本地标记。这样会更快,以便我们可以继续使用xargsgit tag -d,这已经足够了。

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

这似乎比被接受的答案更加复杂。有什么好处吗? - theUtherSide
3
如果你需要删除数千个标签,那么速度会快10-100倍。 - TonyH
谢谢您澄清。原帖询问如何删除单个标签。我无法想象为什么有人会使用这种方法来删除单个标签。也许这个答案更适合另一个涉及删除多个标签的问题。 - theUtherSide
我认为这并不存在。我可以创建它来回答自己。你认为这样做合适吗? - TonyH
1
我是这么做的!实际上,我认为这在这里是一种相当普遍的做法。 - theUtherSide

8

这是一个简单的脚本,可以从本地和原始位置中删除给定标签。该脚本还会检查该标签是否真的存在。

if [ $(git tag -l "$1") ]; then
    git tag --delete  $1
    git push --delete origin $1

    echo done.
else
    echo tag named "$1" was not found
fi

使用方法:

  • 创建一个shell脚本文件(例如git-tag-purge.sh)并粘贴内容。
  • 对脚本文件进行chmod操作,使其可执行。
  • 将脚本设置为全局可用。
  • 进入你的git项目目录。
  • 调用脚本(例如
    $>git-tag-purge.sh tag_name
    )。

7
如果您正在使用PowerShell,并且想要删除一堆文件:
# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }

当然,您也可以在删除之前对它们进行筛选:
git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }

7

对于使用tortoise git的用户,在处理数百个标签时,您可以使用用户界面一次性删除多个标签,但是这个图形用户界面非常隐蔽,需要通过上下文菜单才能找到。

从资源管理器窗口右键单击 -> 浏览引用 -> 右键单击ref/refmotes/name -> 选择'Delete remote tags'

enter image description here

请查看https://tortoisegit.org/docs/tortoisegit/tgit-dug-browse-ref.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接