从Git存储库中删除所有标签


224

我想从Git存储库中删除所有标签。我怎样才能做到这一点?

使用本地git tag -d tagname删除标签tagname,并使用git push --tagsgit提供程序上的标签更新。

我试过了:

git tag -d *

但是我看到这*意味着来自当前目录的文件。

$ git tag -d *
error: tag 'file1' not found.
error: tag 'file2' not found.
...

考虑我有很多标签,并且我想全部删除它们。

Answers:


419
git tag | xargs git tag -d

只需使用Linux理念即可完成所有工作。在Windows上,请使用git bash与相同的命令。


136
谢谢。该命令删除本地标签。我曾经git tag -l | xargs -n 1 git push --delete origin从远程删除它们。
尼卡比曹

7
在Windows上?
CodeManX

7
@CoDEmanX在Windows上,应使用git bash并使用相同的命令。
inf3rno

2
不删除远程标签,成千上万的标签也很慢。
阿德里安·贝克

1
Windows 10上的“ xargs”未被识别为内部或外部命令
Gulzar

207

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

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

然后删除本地副本:

git tag | xargs git tag -d

远程删除对于许多标签来说太慢了。
ffxsam

5
如果您有很多远程标记,则此答案会更快:stackoverflow.com/a/34395864/747044
adriaan

此答案中的命令顺序假定没有仅本地标记。
Acumenus

这太慢了,下面的解决方案更好。
愚人节

如果您需要输入密码进行提交,则每个标签都需要密码。另一种解决方案更好。
kap

56

在一个命令中推送删除所有标签可能更有效。特别是如果您有几百个。

在合适的非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

还可能存在其他方法来获取行列表,将它们用引号引起来,将它们制成单行然后将该行传递给命令。考虑到这是最终的猫剥皮环境以及所有其他情况。


3
我有几千个标签,从一个远程云存储库中逐个删除它们需要花费数天的时间,此问题得以解决。
阿德里安·贝克

怎么xargs -L 1办?
ymett

-L max-lines --max-lines [= max-lines] -l [max-lines]每个命令行最多使用max-lines非空白输入行。对于“ -l”,如果省略,最大行数默认为1。对于“ -L”,该参数是强制性的。尾随空白会导致输入行在逻辑上在下一条输入行上连续,以便对行进行计数。表示“ -x”。不建议使用此选项的“ -l”形式,而应使用兼容POSIX的“ -L”选项。 gnu.org/software/findutils/manual/html_node/find_html/…–
理查德·阿夸

@RichardAQuadling好的,但是答案有什么作用?git tag返回标签,每行一个,然后每行xargs -L 1输出一个,这是什么意思?
ymett

嗯 在这种情况下,似乎什么也没有!除了让事情变慢之外!
理查德·阿夸德

24

对于使用PowerShell的Windows用户:

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

这将通过git tag执行返回的git tag -d每一行来删除所有返回的标签。


23

添加到Stefan的答案中,该答案缺少如何从远程删除标签。对于Windows Powershell,您可以运行此命令先删除远程标签,然后再删除本地标签。

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

19

如果本地存储库中没有标签,则可以删除远程标签,而不必将其带入本地存储库。

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

不要忘记将“ origin”替换为您的远程处理程序名称。


优秀的!一口气删除了它们。另一个命令是每2秒删除一个命令
fregante


6

您还可以使用:

git tag -d $(git tag)

如果你有很多的标签,这将无法正常工作,像成千上万的
DixonD

在这种情况下,您可以使用以下命令:git tag -d $(git tag | head -n 999)并执行x次
ViZeke

1

由于所有这些选项仅适用于linux,因此以下是任何需要处理的Windows等效工具:

FOR /F usebackq %t IN (`git tag`) DO @git tag --delete %t

1

我必须删除带有前缀的标签

例如,我必须删除标签v0.0.1,v0.0.2,v0.0.3,v0.0.4,v0.0.5

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

列出所有带有前缀的标签

git tag -l "v0.0.*"

删除标签

git tag -d $tag_names

这就是第一个语句的工作方式


快速,简单,有效。工作,谢谢!
VedranMandić

0

如果您需要删除许多上游(原始)标签,Powershell v7支持并行foreach:

git tag | foreach-object -Parallel { 
git push origin --delete $_ 
git tag -d $_ 
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.