我该如何删除已经推送的 Git 标签?
请注意,如果你有一个命名与远程标签相同的远程分支,这些命令就会产生歧义:
git push origin :tagname
git push --delete origin tagname
所以你必须使用这个命令来删除标签:
git push origin :refs/tags/<tag>
还有这个用于删除分支的操作:
git push origin :refs/heads/<branch>
否则,您将会得到如下错误:
error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'
# Local tag example:
git tag -d v1.0.0
# Remote tag example:
git push -d origin v1.0.0
# Local tag example:
git tag -d v1.0.0 v1.1.0
# Remote tag example:
git push -d origin v1.0.0 v1.1.0
# Local tag example:
git tag -d $(git tag -l "*beta*")
# Remote tag example:
git push -d origin $(git tag -l "*beta*")
如果你在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。在需要删除超过11,000个标签时阅读这些回答后,我了解到这些依赖于 xargs
的方法太慢了,除非你有几个小时可以浪费。
经过努力,我找到了两种快得多的方法。对于这两种方法,都要从git tag
或git ls-remote --tags
开始,以列出您想要在远程删除的标签列表。在下面的示例中,您可以省略或替换 sorting_processing_etc
为任何您想要的 grep
, sort
, tail
, 或者 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
这是如何工作的呢?普通的、每行一个的标签列表将被转换为一个以空格分隔的标签单行,每个标签前面都加上:
。所以...
tag1 becomes
tag2 ======> :tag1 :tag2 :tag3
tag3
使用这种格式标签的git push
命令不会将任何内容推送到每个远程引用中,而是删除了它(以这种方式推送的正常格式为local_ref_path:remote_ref_path
)。
完成这两种方法后,您可能还想删除本地标签。这样做更快,因此我们可以回到使用xargs
和git tag -d
,这已经足够了。
git tag | sorting_processing_etc | xargs -L 1 git tag -d
与远程删除类似:
git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
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
正如 @CubanX 建议的那样,我将这个答案从我的原始答案中分离出来:
xargs
快几倍并且可能随着调整而更加扩展的方法。它使用Github API、个人访问令牌并利用实用程序parallel
。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 /小时,但也似乎有一个未记录的短期限制。
之后,您可能还想删除本地标记。这样会更快,以便我们可以继续使用xargs
和git tag -d
,这已经足够了。
git tag | sorting_processing_etc | xargs -L 1 git tag -d
这是一个简单的脚本,可以从本地和原始位置中删除给定标签。该脚本还会检查该标签是否真的存在。
if [ $(git tag -l "$1") ]; then
git tag --delete $1
git push --delete origin $1
echo done.
else
echo tag named "$1" was not found
fi
使用方法:
$>git-tag-purge.sh tag_name)。
# 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 $_ }
对于使用tortoise git的用户,在处理数百个标签时,您可以使用用户界面一次性删除多个标签,但是这个图形用户界面非常隐蔽,需要通过上下文菜单才能找到。
从资源管理器窗口右键单击 -> 浏览引用 -> 右键单击ref/refmotes/name -> 选择'Delete remote tags'
请查看https://tortoisegit.org/docs/tortoisegit/tgit-dug-browse-ref.html