从Git仓库中删除所有标签

357

我想从Git仓库中删除所有标签。怎样做?

使用git tag -d 标签名可以在本地删除标签标签名,然后使用git push --tags更新Git服务提供者上的标签。

我尝试了:

git tag -d *

但是我发现*表示当前目录中的文件。

$ git tag -d *
error: tag 'file1' not found.
error: tag 'file2' not found.
...
考虑我有很多标签,我想全部删除它们。
19个回答

605
git tag | xargs git tag -d

只需遵循Unix哲学,在其中使用管道命令。

在Windows上,请使用git bash并输入相同的命令。


196
谢谢。这个命令会删除本地标签。我使用了 git tag -l | xargs -n 1 git push --delete origin 命令来从远程端删除它们。 - Ionică Bizău
8
在Windows上,您应该使用Git Bash并使用相同的命令。 - inf3rno
2
不会删除远程标签,对于成千上万个标签也非常慢。 - Adrian Baker
2
“xargs”在Windows 10上不被识别为内部或外部命令 - Gulzar
3
在尝试删除标签之前,不要忘记运行 git fetch --all --tags --prune - Akito
显示剩余6条评论

330

要删除远程标签(在删除本地标签之前),只需执行以下操作:

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

然后删除本地副本:

git tag | xargs git tag -d

1
远程删除对于数十个标签来说太慢了。 - ffxsam
13
如果你有大量的远程标签,使用这个答案会更快:https://dev59.com/lWIk5IYBdhLWcg3wJ7L4#34395864 - adriaan
1
本答案中命令的顺序假定没有本地标签。 - Asclepius
1
如果您需要为提交输入密码短语,则每个标签都需要密码短语。另一种解决方案更好。 - kap
清理远程后,我的队友们如何清理他们本地的标签? - IT Gumby
显示剩余3条评论

98

如果你有几百个标签需要删除,用一个命令来删除所有标签可能会更有效率。

在适当的非 Windows shell 中,删除所有远程标签:

git tag | xargs -L 1 | xargs git push origin --delete

然后删除所有本地标签:

git tag | xargs -L 1 | xargs git tag --delete

只要您的标签名称中没有',这应该是没问题的。针对此情况,以下命令应该是可行的。

git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git push origin --delete
git tag | xargs -I{} echo '"{}"' | tr \\n \\0 | xargs --null git tag --delete

可能存在将一组行包裹在引号中,使它们成为单行,然后将该行传递给命令的其他方法。考虑到这是最终的"猫剥皮"环境,应该有多种方法可以实现。


4
我有几千个标签,一个个从远程云仓库中删除需要花费数天时间,而这个问题得到了解决。 - Adrian Baker
xargs -L 1 是什么意思? - ymett
-L max-lines --max-lines[=max-lines] -l[max-lines] 使用最多max-lines个非空白输入行来处理每个命令行。对于“-l”,如果省略,则max-lines默认为1。对于“-L”,参数是必需的。尾随空格会导致输入行在逻辑上继续到下一个输入行,以计算行数。意味着“-x”。此选项的“-l”形式已被弃用,应使用符合POSIX标准的“-L”选项。 https://www.gnu.org/software/findutils/manual/html_node/find_html/xargs-options.html#xargs-options - Richard A Quadling
1
@RichardAQuadling 好的,但这对答案有什么影响吗?git tag会返回标签,每行一个,然后xargs -L 1将它们逐行输出,那这样做有什么作用? - ymett
1
嗯,这个上下文中似乎没有什么用!除了让事情变得稍微慢一点! - Richard A Quadling
一定是今天运行缓慢。xargs -L 1 输出所有标签的一行。因此,下一个 xargs 将删除这一行。所以,它不是逐个删除,而是一次性删除所有标签。我甚至用英语写出来了“...一系列行,...将它们变成单行,然后将该行传递给命令...”,但当你问到 xargs -L 1 时,我没有注意到。对此很抱歉。 - Richard A Quadling

49

对于使用 PowerShell 的 Windows 用户:

git tag | foreach-object -process { git tag -d $_ }

执行此命令将通过执行每个返回的行的git tag -d来删除git tag返回的所有标签。


4
如果您还想删除远程仓库中的标签,请运行命令git tag | foreach-object -process { git tag -d $_ && git push --delete origin $_ }。这将逐个删除每个标签,如果有很多标签,可能需要花费一些时间。有没有人知道如何更高效地完成这个任务? - tolache
如果 PowerShell 给出错误信息:“在此版本中 && 不是有效的语句分隔符”,请使用 | 替换 && - Kristoffer Berge

36

如果您的本地repo中没有这些标签,您可以删除远程标签而无需将其带到本地repo。

git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete

别忘了将 "origin" 替换成您的远程处理程序名称。


太好了!这个命令一次性删除了它们所有。另一个命令是每2秒钟删除一个。 - fregante

33

在Stefan的回答中补充一点,即如何删除远程标签。 对于Windows Powershell,您可以运行以下命令首先删除远程标签,然后再删除本地标签。

git tag | foreach-object -process { git push origin --delete $_ }
git tag | foreach-object -process { git tag -d $_ }  

17

要删除所有本地标签,只需运行以下命令

git tag | xargs git tag -d

如果您想删除本地标签后,通过运行上述命令删除远程标签,则可以运行以下命令:

git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete

注意:将原始处理器替换为您的远程处理器


这个是列出的所有选项中效果最好的一个。其他的都会返回错误:fatal: --delete doesn't make sense without any refs - TheRealChx101

15

11
您还可以使用:

git tag -d $(git tag)

如果您有很多标签,比如成千上万个标签,那么这种方法将无法工作。 - DixonD
使用以下命令可以删除所有标签: git tag -d $(git tag | head -n 999) 您可以执行多次以删除更多标签。 - ViZeke

8

我需要删除带有特定前缀的标签。

例如,我需要删除v0.0.1、v0.0.2、v0.0.3、v0.0.4和v0.0.5这些标签。

git tag -d $(git tag -l "v0.0.*")

对上述声明进行分解和解释:

  1. 列出所有具有前缀的标记

    git tag -l "v0.0.*"

  2. 删除标记

    git tag -d $tag_names

这就是上述声明的工作原理。


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