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

Posted

技术标签:

【中文标题】从 Git 存储库中删除所有标签【英文标题】:Delete all tags from a Git repository 【发布时间】:2013-11-01 18:22:23 【问题描述】:

我想。我该怎么做?

使用git tag -d tagname在本地删除标签tagname,使用git push --tags更新git提供者上的标签。

我试过了:

git tag -d *

但我看到* 表示当前目录中的文件。

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

考虑到我有很多标签,我想全部删除。

【问题讨论】:

【参考方案1】:

在本地,git标签只是存储在.git/refs/tags子文件夹中的磁盘上的文件。

您可以使用您最喜欢的删除文件方法(rm *、从文件资源管理器 UI 中删除等)删除所有存储在那里的文件。

【讨论】:

【参考方案2】:

使用通配符模式删除本地和远程标签的单行。

TAGPATTERN="0.1.*" ; git push origin --delete $(git tag -l $TAGPATTERN) ; git tag -d $(git tag -l $TAGPATTERN)

由于列表是从本地生成的,所以首先删除远程标签。

【讨论】:

【参考方案3】:
git tag | xargs git tag -d

只需按照Unix philosophy 进行所有操作即可。

在 Windows 上使用 git bash 和相同的命令。

【讨论】:

谢谢。该命令删除本地标签。我使用git tag -l | xargs -n 1 git push --delete origin 将它们从遥控器中删除。 @CoDEmanX 在 Windows 上,您应该使用 git bash 和相同的命令。 不删除远程标签,数千个标签也很慢。 @AdrianBaker 也许你可以增加-n 后面的数字来并行化。我不确定这种方法是否安全 'xargs' 在 Windows 10 上未被识别为内部或外部命令【参考方案4】:

显示所有包含“v”的标签

git tag -l | grep v | xargs -n 1 sh -c 'echo "Processing tag $0\n" && git show -s $0'

【讨论】:

【参考方案5】:

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

例如,我必须删除标签 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 标签 -d $tag_names 这就是该语句的工作原理

【讨论】:

【参考方案6】:

如果您有大量需要删除的上游(来源)标签,Powershell v7 支持并行 foreach:

git tag | foreach-object -Parallel  
git push origin --delete $_ 
git tag -d $_ 

【讨论】:

【参考方案7】:

由于所有这些选项仅在 linux 中有效,因此对于任何必须处理该问题的人来说,这里是 windows 等效项:

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

【讨论】:

【参考方案8】:

要删除远程标签(在删除本地标签之前),只需:

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

然后删除本地副本:

git tag | xargs git tag -d

【讨论】:

远程删除对于几十个标签来说太慢了。 如果你有很多远程标签,这个答案会更快:***.com/a/34395864/747044 这个答案中的命令顺序假定没有本地标签。 这太慢了,下面的解决方案更好。 如果您需要为提交输入密码,这需要每个标签的密码。另一种解决方案更好。【参考方案9】:

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

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

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

【讨论】:

太棒了!这一口气将它们全部删除。另一个命令是每 2 秒删除一个【参考方案10】:

你也可以使用:

git tag -d $(git tag)

【讨论】:

如果您有很多标签,例如数千个,这将不起作用 在这种情况下,您可以使用类似: git tag -d $(git tag | head -n 999) 并执行 x 次【参考方案11】:

添加到 Stefan 的答案中缺少如何从远程删除标签。对于 windows powershell,您可以运行它来删除远程标签,然后是本地标签。

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

【讨论】:

【参考方案12】:

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

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

可能存在其他获取行列表、将它们括在引号中、使它们成为单行然后将该行传递给命令的方法。考虑到这是终极的猫剥皮环境。

【讨论】:

我有几千个标签,从远程云存储库中逐个删除它们需要几天时间,这解决了。 xargs -L 1 是做什么的? -L max-lines --max-lines[=max-lines] -l[max-lines] 每个命令行最多使用 max-lines 个非空白输入行。对于“-l”,如果省略,max-lines 默认为 1。对于“-L”,参数是强制性的。尾随空格导致输入行在逻辑上继续到下一个输入行,以计算行数。暗示“-x”。此选项的“-l”形式已弃用,取而代之的是符合 POSIX 的“-L”选项。 gnu.org/software/findutils/manual/html_node/find_html/… @RichardAQuadling 好的,但这对答案有什么影响? git tag 返回标签,每行一个,然后xargs -L 1 每行输出一个,那它有什么用呢? 嗯。在这种情况下似乎什么都没有!除了让事情变慢一点!【参考方案13】:

对于使用 PowerShell 的 Windows 用户:

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

这会删除git tag 返回的所有标签,方法是为返回的每一行执行git tag -d

【讨论】:

【参考方案14】:

Windows 用户:

这会通过运行 git tag 并将该列表提供给 git tag -d 来删除所有本地标签:

FOR /f "tokens=*" %a in ('git tag') DO git tag -d %a

(发现于:https://gist.github.com/RandomArray/fdaa427878952d9768b0)

【讨论】:

以上是关于从 Git 存储库中删除所有标签的主要内容,如果未能解决你的问题,请参考以下文章

如何从 git 存储库中删除源

如何从 git 存储库中删除文件而不实际删除文件 [重复]

如何从 Git 存储库中删除文件?

如何从 Git 存储库中删除文件?

从 Git 存储库中删除已从磁盘中删除的多个文件

从 Git 存储库中删除已从磁盘中删除的多个文件