从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个回答

3

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

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

3

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

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

2

最新版本已经进行了并行处理和过滤

git tag -l "v1.0.*" | xargs -L 1 | xargs git push origin --delete
git fetch origin --prune --prune-tags

第一行,同时从远程删除所有匹配的标签。
第二行,从git版本v2.26.2开始,通过修剪所有已删除的标签来更新当前仓库。

为了测试第一行,您可以添加--dry-run参数,我还鼓励您尝试使用标签列表命令,它具有良好的通配符和排除/包含功能。


1

我在任何地方都没有找到不需要每个标签调用git push的解决方案,所以我想出了这个变体,在我的情况下,将运行时间从几个小时缩短到几秒钟:

git push --delete origin $( git ls-remote --tags origin | awk '{print $2}' | grep -Ev "\^" | tr '\n' ' ')

说明

  • git push --delete origin $(...): 删除远程仓库中的一个或多个标签
  • $( git ls-remote --tags origin | awk '{print $2}' | grep -Ev "\^" | tr '\n' ' '): 创建一个以空格分隔的所有标签的字符串
    • git ls-remote --tags origin: 打印远程仓库中的所有标签
    • ... | awk '{print $2}' | ...: 只打印上一个命令输出的第二列
    • ... | grep -Ev "\^" | ...: 过滤掉不需要的 refs/tags/mytag^{} 变体(不确定它们来自哪里)
    • ... | tr '\n' ' ': 将列表转换为以空格分隔的字符串

它利用了在以空格分隔的字符串中提供多个标签名称的事实,因此只调用一次 git delete


1
显示所有包含“v”的标签。
git tag -l | grep v | xargs -n 1 sh -c 'echo "Processing tag $0\n" && git show -s $0'

1
一条命令可使用通配符模式删除本地和远程标记。 TAGPATTERN="0.1.*" ; git push origin --delete $(git tag -l $TAGPATTERN) ; git tag -d $(git tag -l $TAGPATTERN) 先删除远程标签,因为列表是从本地生成的。

1
针对 Windows 系统,执行以下操作可以删除远程标签:
git fetch --tags
git push origin --delete $(git tag -l)

0

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

您可以直接cd .git/refs/tags并使用您喜欢的文件删除方法(rm *、从文件资源管理器UI中删除等)删除存储在那里的所有文件。


0
在PowerShell中,你只需要运行这个命令:
git tag | % {git tag -d $_}

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

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