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

问题描述 投票:0回答:19

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

使用

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

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

git git-tag
19个回答
598
投票
git tag | xargs git tag -d

只需遵循 Unix 哲学,通过管道传输一切。

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


327
投票

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

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

然后删除本地副本:

git tag | xargs git tag -d

97
投票

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

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

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


49
投票

对于使用 PowerShell 的 Windows 用户:

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

这会通过对返回的每一行执行

git tag
来删除
git tag -d
返回的所有标签。


34
投票

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

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

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


33
投票

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

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

16
投票

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

git tag | xargs git tag -d

如果要通过上面的命令删除本地标签后删除远程标签,可以运行下面的命令

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

注意:用您的远程处理程序替换 origin


15
投票

对于 Windows 用户:

这会通过运行 git tag 并将该列表提供给 git tag -d:

来删除所有本地标签
FOR /f "tokens=*" %a in ('git tag') DO git tag -d %a

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


11
投票

您还可以使用:

git tag -d $(git tag)

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

这就是该声明的作用


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
投票
显示所有包含“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
投票
我没有找到不需要每个标签调用

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
投票
对于 Windows,执行此操作可删除远程标签:

git fetch --tags git push origin --delete $(git tag -l)
    

0
投票
在本地,git 标签只是磁盘上存储在

.git/refs/tags

 子文件夹中的文件。

您可以使用您最喜欢的删除文件方法(

cd .git/refs/tags

,从文件资源管理器 UI 中删除等)
rm *
 并删除存储在其中的所有文件


0
投票
在 PowerShell 中你可以运行这个:

git tag | % {git tag -d $_}
    
© www.soinside.com 2019 - 2024. All rights reserved.