如何删除 Git 代码仓库中的所有 tag

我想从Git存储库中删除所有 Tag。我该怎么做呢?

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

假设我有很多标签,我想全部删除它们。

100818 次浏览
git tag | xargs git tag -d

只需遵循Unix哲学,在其中管道所有内容。

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

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

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

然后删除本地副本:

git tag | xargs git tag -d

windows用户:

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

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

(在https://gist.github.com/RandomArray/fdaa427878952d9768b0上找到)

对于使用PowerShell的Windows用户:

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

通过对返回的每一行执行git tag -d,删除git tag返回的所有标记。

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

在一个合适的非windows shell中,删除所有远程标记:

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

然后删除所有本地标签:

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

这应该是OK的,只要你没有'在你的标签名。为此,下面的命令应该是可以的。

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

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

斯特凡的答案是不知道如何从远程删除标签。对于windows powershell,可以先删除远程标记,然后删除本地标记。

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

你还可以使用:

git tag -d $(git tag)

如果你的本地回购中没有这些标签,你可以删除远程标签,而不必把它带到本地回购。

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

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

因为所有这些选项都只在linux中工作,下面是windows中必须处理这些问题的等效选项:

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

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

例如,我必须删除标签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标签-l "v0.0.*"

  2. 删除标签

    Git标记-d $tag_names

这就是这个表述的原理

如果你有很多upstream (origin)标签需要删除,Powershell v7支持parallel foreach:

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

显示所有包含"v"

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

使用通配符模式删除本地和远程标记的一行代码。

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

远程标记首先被删除,因为列表是从本地生成的。

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

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

并行化和过滤了最新版本

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

第一行,并行地从remote中删除所有匹配的标签。
第二行,用删除所有已删除的标签更新当前的回购,从git版本< >强v2.26.2 < / >强开始

为了测试第一行,你可以添加--dry-run,我也鼓励你添加探索tag list命令,它有很好的通配符和排除/包含。

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

git tag | xargs git tag -d

如果在执行上述命令删除本地标签后,还需要删除远端标签,可以执行以下命令

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

注意:用远程处理程序替换原点

我没有在任何地方找到不需要每个标记调用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一次。