从 Git 存储库中删除所有标签
Posted
技术标签:
【中文标题】从 Git 存储库中删除所有标签【英文标题】:Delete all tags from a Git repository 【发布时间】:2013-11-01 18:22:23 【问题描述】:我想。我该怎么做?
使用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.
...
考虑到我有很多标签,我想全部删除。
【问题讨论】:
【参考方案1】:在本地,git标签只是存储在.git/refs/tags
子文件夹中的磁盘上的文件。
您可以使用您最喜欢的删除文件方法(rm *
、从文件资源管理器 UI 中删除等)删除所有存储在那里的文件。
【讨论】:
【参考方案2】:使用通配符模式删除本地和远程标签的单行。
TAGPATTERN="0.1.*" ; git push origin --delete $(git tag -l $TAGPATTERN) ; git tag -d $(git tag -l $TAGPATTERN)
由于列表是从本地生成的,所以首先删除远程标签。
【讨论】:
【参考方案3】:git tag | xargs git tag -d
只需按照Unix philosophy 进行所有操作即可。
在 Windows 上使用 git bash 和相同的命令。
【讨论】:
谢谢。该命令删除本地标签。我使用git tag -l | xargs -n 1 git push --delete origin
将它们从遥控器中删除。
@CoDEmanX 在 Windows 上,您应该使用 git bash 和相同的命令。
不删除远程标签,数千个标签也很慢。
@AdrianBaker 也许你可以增加-n
后面的数字来并行化。我不确定这种方法是否安全
'xargs' 在 Windows 10 上未被识别为内部或外部命令【参考方案4】:
显示所有包含“v”的标签
git tag -l | grep v | xargs -n 1 sh -c 'echo "Processing tag $0\n" && git show -s $0'
【讨论】:
【参考方案5】:我必须删除带有前缀的标签
例如,我必须删除标签 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 标签 -d $tag_names 这就是该语句的工作原理
【讨论】:
【参考方案6】:如果您有大量需要删除的上游(来源)标签,Powershell v7 支持并行 foreach:
git tag | foreach-object -Parallel
git push origin --delete $_
git tag -d $_
【讨论】:
【参考方案7】:由于所有这些选项仅在 linux 中有效,因此对于任何必须处理该问题的人来说,这里是 windows 等效项:
FOR /F usebackq %t IN (`git tag`) DO @git tag --delete %t
【讨论】:
【参考方案8】:要删除远程标签(在删除本地标签之前),只需:
git tag -l | xargs -n 1 git push --delete origin
然后删除本地副本:
git tag | xargs git tag -d
【讨论】:
远程删除对于几十个标签来说太慢了。 如果你有很多远程标签,这个答案会更快:***.com/a/34395864/747044 这个答案中的命令顺序假定没有本地标签。 这太慢了,下面的解决方案更好。 如果您需要为提交输入密码,这需要每个标签的密码。另一种解决方案更好。【参考方案9】:如果您的本地仓库中没有标签,您可以删除远程标签而无需将其带到本地仓库。
git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete
不要忘记将“origin”替换为您的远程处理程序名称。
【讨论】:
太棒了!这一口气将它们全部删除。另一个命令是每 2 秒删除一个【参考方案10】:你也可以使用:
git tag -d $(git tag)
【讨论】:
如果您有很多标签,例如数千个,这将不起作用 在这种情况下,您可以使用类似: git tag -d $(git tag | head -n 999) 并执行 x 次【参考方案11】:添加到 Stefan 的答案中缺少如何从远程删除标签。对于 windows powershell,您可以运行它来删除远程标签,然后是本地标签。
git tag | foreach-object -process git push origin --delete $_
git tag | foreach-object -process git tag -d $_
【讨论】:
【参考方案12】:在一个命令中推送删除所有标签可能更有效。特别是如果你有几百个。
在合适的非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
可能存在其他获取行列表、将它们括在引号中、使它们成为单行然后将该行传递给命令的方法。考虑到这是终极的猫剥皮环境。
【讨论】:
我有几千个标签,从远程云存储库中逐个删除它们需要几天时间,这解决了。xargs -L 1
是做什么的?
-L max-lines --max-lines[=max-lines] -l[max-lines] 每个命令行最多使用 max-lines 个非空白输入行。对于“-l”,如果省略,max-lines 默认为 1。对于“-L”,参数是强制性的。尾随空格导致输入行在逻辑上继续到下一个输入行,以计算行数。暗示“-x”。此选项的“-l”形式已弃用,取而代之的是符合 POSIX 的“-L”选项。 gnu.org/software/findutils/manual/html_node/find_html/…
@RichardAQuadling 好的,但这对答案有什么影响? git tag
返回标签,每行一个,然后xargs -L 1
每行输出一个,那它有什么用呢?
嗯。在这种情况下似乎什么都没有!除了让事情变慢一点!【参考方案13】:
对于使用 PowerShell 的 Windows 用户:
git tag | foreach-object -process git tag -d $_
这会删除git tag
返回的所有标签,方法是为返回的每一行执行git tag -d
。
【讨论】:
【参考方案14】: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 存储库中删除所有标签的主要内容,如果未能解决你的问题,请参考以下文章