我想从 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 tag -l | xargs -n 1 git push --delete origin
然后删除本地副本:
git tag | xargs git tag -d
用一个命令推送删除所有标签可能会更有效。特别是如果你有几百个的话。
在合适的非 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
可能存在获取行列表、将它们用引号引起来、使它们成为单行然后将该行传递给命令的其他方法。考虑到这是终极的猫剥皮环境等等。
对于使用 PowerShell 的 Windows 用户:
git tag | foreach-object -process { git tag -d $_ }
这会通过对返回的每一行执行
git tag
来删除 git tag -d
返回的所有标签。
如果您的本地存储库中没有标签,您可以删除远程标签,而无需将其带到本地存储库。
git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete
不要忘记将“origin”替换为您的远程处理程序名称。
添加 Stefan 的答案,其中缺少如何从远程删除标签。对于 Windows powershell,您可以运行此命令首先删除远程标签,然后删除本地标签。
git tag | foreach-object -process { git push origin --delete $_ }
git tag | foreach-object -process { git tag -d $_ }
要删除所有本地标签,只需运行以下命令
git tag | xargs git tag -d
如果要通过上面的命令删除本地标签后删除远程标签,可以运行下面的命令
git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete
注意:用您的远程处理程序替换 origin
对于 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 tag -d $(git tag)
我必须删除带有前缀的标签
例如,我必须删除标签 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 tag -d $tag_names
这就是该声明的作用
由于所有这些选项仅适用于 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 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 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 fetch --tags
git push origin --delete $(git tag -l)
.git/refs/tags
子文件夹中的文件。您可以使用您最喜欢的删除文件方法(
cd .git/refs/tags
,从文件资源管理器 UI 中删除等)
rm *
并删除存储在其中的所有文件
git tag | % {git tag -d $_}