如何删除已推送的Git标记?
当前回答
gitpush--delete origin$TAGNAME是正确的方法(除了本地删除之外)。
但是:确保使用Git 2.31+(2021第一季度)。
“git-push$there--delete”(man)本应被诊断为一个错误,但却变成了一个匹配的push,已使用git 2.31(2021第1季度)进行了更正。
参见Junio C Hamano(gitster)提交的20e4164(2021 2月23日)。(由Junio C Hamano——gitster——于2021 2月25日提交1400458合并)
push:不要将--delete“”转换为匹配的push通知人:Tilman Vogel
当我们将语法糖“git push remote--delete”(man)<ref>添加到“git推送”(man)中,作为标准git pushremote(man)的同义词:语法在f517f1f(“内置推送:add(man)--delete as syntax sugar for:foo”,2009-12-30,git v1.7.0-rc0--merge)中时,我们没有足够谨慎地确保<ref>不为空。盲目地将“--delete<ref>”重写为“:<ref>“意味着空字符串<ref>将导致refspec“:”,这是要求“匹配”推送的语法,但不删除任何内容。更糟糕的是,如果有匹配的引用可以快速转发,那么即使用户觉得它们还没有准备好推出,它们也会过早发布,这将是一场真正的灾难。
其他回答
似乎xargs已经做了很多工作。回顾这篇文章,我猜你所经历的xargs的缓慢是因为最初的答案使用了xargs-n 1,而实际上并不需要。
除了xargs自动处理最大命令行长度之外,这与方法1等效:
git tag | sorting_processing_etc | xargs git push --delete origin
xargs也可以并行运行进程。使用xargs的方法2:
git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin
上面最多使用5个进程来处理每个进程中最多100个参数。你可以尝试这些论点,以找到最适合你的需求的东西。
其他答案指出了如何实现这一点,但您应该记住后果,因为这是一个远程存储库。
git标签手册页的On Retagging部分很好地解释了如何礼貌地将更改通知远程回购的其他用户。他们甚至提供了一个方便的公告模板,用于传达其他人应该如何获得您的更改。
如果您在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
如果您正在使用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 $_ }
推荐文章
- 为什么我需要显式地推一个新分支?
- 如何撤消最后的git添加?
- Rubymine:如何让Git忽略Rubymine创建的.idea文件
- Gitignore二进制文件,没有扩展名
- Git隐藏错误:Git隐藏弹出并最终与合并冲突
- 了解Git和GitHub的基础知识
- 没有。Git目录的Git克隆
- Git与Mercurial仓库的互操作性
- 忽略git中修改(但未提交)的文件?
- “git restore”命令是什么?“git restore”和“git reset”之间有什么区别?
- Git合并与强制覆盖
- Git拉另一个分支
- 在Bash命令提示符上添加git分支
- 如何更改Git日志日期格式
- git pull -rebase和git pull -ff-only之间的区别