我想从Git仓库中删除所有标签。怎样做?
使用git tag -d 标签名
可以在本地删除标签标签名
,然后使用git push --tags
更新Git服务提供者上的标签。
我尝试了:
git tag -d *
但是我发现*
表示当前目录中的文件。
$ git tag -d *
error: tag 'file1' not found.
error: tag 'file2' not found.
...
考虑我有很多标签,我想全部删除它们。由于所有这些选项仅适用于Linux,因此对于任何需要处理Windows的人,以下是其等效选项:
FOR /F usebackq %t IN (`git tag`) DO @git tag --delete %t
Powershell v7 支持并行 foreach,如果你有大量需要删除的上游(源)标签:
git tag | foreach-object -Parallel {
git push origin --delete $_
git tag -d $_
}
最新版本已经进行了并行处理和过滤
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
参数,我还鼓励您尝试使用标签列表命令,它具有良好的通配符和排除/包含功能。
我在任何地方都没有找到不需要每个标签调用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
。
git tag -l | grep v | xargs -n 1 sh -c 'echo "Processing tag $0\n" && git show -s $0'
git fetch --tags
git push origin --delete $(git tag -l)
在本地,git标签只是存储在.git/refs/tags
子文件夹中的磁盘文件。
您可以直接cd .git/refs/tags
并使用您喜欢的文件删除方法(rm *
、从文件资源管理器UI中删除等)删除存储在那里的所有文件。
git tag | % {git tag -d $_}