如何删除已推送的Git标记?


当前回答

其他答案指出了如何实现这一点,但您应该记住后果,因为这是一个远程存储库。

git标签手册页的On Retagging部分很好地解释了如何礼貌地将更改通知远程回购的其他用户。他们甚至提供了一个方便的公告模板,用于传达其他人应该如何获得您的更改。

其他回答

用于数千个远程标签的速度快100倍

在阅读了这些答案,同时需要删除11000多个标签之后,我了解到这些方法依赖于xargs,或者xargs耗时太长,除非你有几个小时可以燃烧。

在挣扎中,我找到了两种更快的方法。对于这两种情况,从git-tag或git-ls-remote-tag开始,列出要删除的远程标记。在下面的示例中,您可以省略sorting_processing_etc,或将其替换为所需的任何greping、sorting、tailing或head(例如grep-P“my_regex”|sort|head-n-200等):


第一种方法是迄今为止最快的,可能比使用xargs快20到100倍,一次至少可以处理几千个标签。

git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh

这是如何工作的?正常的、以行分隔的标记列表被转换为一行以空格分隔的标记,每个标记都以:so。

tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

将git push与此格式标记一起使用,不会将任何内容推送到每个远程引用中,并将其删除(以这种方式推送的正常格式是local_ref_path:remote_ref_path)。

方法二在同一页的其他地方作为单独的答案


在这两种方法之后,您可能也希望删除本地标记。这要快得多,所以我们可以返回使用xargs和git标记-d,这就足够了。

git tag | sorting_processing_etc | xargs -L 1 git tag -d

或类似于远程删除:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")

如果您正在使用PowerShell,并且希望删除其中的一部分:

# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }

当然,您也可以在删除之前过滤它们:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }

正如@CubanX所建议的,我将这个答案与我的原始答案分开:

这里有一种方法,它比xargs快几倍,并且可以通过调整进行扩展。它使用Github API(一种个人访问令牌),并并行利用该实用程序。

git tag | sorting_processing_etc | parallel --jobs 2 curl -i -X DELETE \ 
https://api.github.com/repos/My_Account/my_repo/git/refs/tags/{} -H 
\"authorization: token GIT_OAUTH_OR_PERSONAL_KEY_HERE\"  \
-H \"cache-control: no-cache\"`

parallel有许多操作模式,但通常会将您给出的任何命令并行化,同时允许您设置进程数量的限制。您可以更改--jobs 2参数以允许更快的操作,但我对Github的速率限制有问题,目前为5000/hr,但似乎也有未记录的短期限制。


在此之后,您可能还想删除本地标记。这要快得多,所以我们可以返回使用xargs和git标记-d,这就足够了。

git tag | sorting_processing_etc | xargs -L 1 git tag -d

如果您在Git存储库中创建了一个名为release01的标记,您可以通过执行以下操作将其从存储库中删除:

git tag -d release01 
git push origin :refs/tags/release01 

要从Mercurial存储库中删除一个:

hg tag --remove featurefoo

请参考https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551

我想删除所有标签,除了那些与模式匹配的标签,这样我就可以删除除最后几个月的生产标签之外的所有标签,这是我取得巨大成功的原因:

删除所有远程标记并从删除中排除表达式

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

删除所有本地标记并从删除中排除表达式

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d