在git中,我如何删除除最新标签以外的所有标签(本地和远程)?

4
我想删除Git仓库中所有标签(本地和远程),除了最新的一个。我已经阅读了有关删除所有标签的文章,但找不到有关选择性删除的信息,即删除除最新标签外的所有标签。

不存在所谓的“远程标签”。只有标签。你有标签,Joe 有标签,Valerie 有标签,还有一个叫 origin 的家伙也有标签,等等。你可以删除自己喜欢的任何标签,并要求那个叫 origin 的家伙删除他自己喜欢的任何标签,但他是否遵守取决于他自己;如果 Valerie 有标签并打电话给 origin 并将她的标签给他,那么她可能会拥有你正在删除的 origin 上的标签,并且会立即全部归还!(这就是为什么这很重要的原因:要问自己的问题是“谁还有这些标签?”) - torek
@torek您好,这是非常富有启发性的回复。我之前并不知道这些内容。您的回答中带来了一些值得注意的点:1)由于标签是在特定提交上的,如果我在A分支上提交代码并将其标记为feature/1.1,然后将A合并到master,那么master将会有该提交;2)Joe已经拉取了master,因此他获得了该提交和标签,并作为本地标签;3)我删除了origin上的标签和我的本地标签,但Joe仍然拥有该标签;4)问题:Joe能否将标签推送到远程?5)问题:如果我在origin上删除标签后,Joe拉取了master或任何A分支,他的本地标签是否会被删除? - SKAD
(1) 是的,(2) 好的,(3) 好的,(4) 是的:Joe 可以推送他的标签副本,可以明确地推送,也可以通过 git push --tags 推送。至于 (5),默认答案是不,但我不确定如果 Joe 运行 git fetch --tags 是否带有 --prune 会发生什么。 - torek
你好@torek,感谢您的解释。他们很有帮助。 - SKAD
3个回答

4

不知怎么的,我在 Stack Overflow 上找到了答案。根据我的需求进行了一些定制。

删除所有远程标签但保留最新的

git describe --abbrev=0 --tags `git rev-list --tags --skip=1` | xargs -n 1 git push --delete origin

删除所有本地标签,但保留最新的。
git describe --abbrev=0 --tags `git rev-list --tags --skip=1` | xargs -n 1 git tag -d

如果你对自己的答案感到满意,那么你可以自己接受它。 - Scott Newson
既然我可以删除除最新标签之外的本地和远程标签,这正是我的要求,那么我可以接受自己的答案吗?这样可以吗? - SKAD

1

删除本地所有标签(即使是 Windows):

git tag -d `git tag | grep -E '.'`

我在这里找到了解决方案here

好的!我使用 git tag -d `git tag | grep -E 'v0.0'` 命令删除了所有带有 v0.0.* 的 Git 标签。 - Taku

0

我不相信在 Git CLI 中有一种选择性删除标签的方法。可能有一些工具可以让你做到这一点,但我不知道。您可以编写一个小脚本来实现所需的效果。以下是一个 PowerShell 片段,可以实现所需的效果。要运行它,您需要 posh-git

git tag -l | Out-File E:\Git\DemoRepo\tags.txt

$lines = Get-Content E:\Git\DemoRepo\tags.txt | Measure-Object -Line

Write-Host "Number of lines: $($lines.Lines)"

$numberOfOlderTags = $lines.Lines - 1

$tagsToDelete = Get-Content E:\Git\DemoRepo\tags.txt | Select-Object -First $numberOfOlderTags

foreach($tagToDelete in $tagsToDelete)
{
    git tag --delete $tagToDelete
}

嗨,谢谢你的回答。不过我另外找到了一种方法! - SKAD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接