如何删除一个git远程标签?
你如何删除已经被推送的git标签?
您只需将“空”参考推送到远程标记名称即可:
git push origin :tagname
或者,更--delete
,使用--delete
选项(或者-d
如果你的git版本早于1.8.0):
git push --delete origin tagname
如果您还需要删除本地标签,请使用:
git tag --delete tagname
背景
将分支,标签或其他引用推送到远程存储库涉及指定“推送哪里,什么源,什么目的地?
git push where-to-push source-ref:destination-ref
将主分支推送到原始主分支的真实世界示例是:
git push origin refs/heads/master:refs/heads/master
由于默认path,可以缩短为:
git push origin master:master
标签以相同的方式工作:
git push origin refs/tags/release-1.0:refs/tags/release-1.0
这也可以缩写为:
git push origin release-1.0:release-1.0
通过省略源ref(冒号前面的部分),将“nothing”推送到目的地,删除远端的ref。
更直接的方法是
git push --delete origin YOUR_TAG_NAME
在这种情况下,IMO前缀冒号的语法有点奇怪
如果你有一个远程标签v0.1.0
删除,而你的远程是origin
,那么简单地说:
git push origin :refs/tags/v0.1.0
如果您还需要在本地删除标签:
git tag -d v0.1.0
查看Adam Franco的答案,解释Git的不寻常的:
删除语法。
删除所有本地标签并获取远程标签列表 :
git tag -l | xargs git tag -d git fetch
删除所有的远程标签
git tag -l | xargs -n 1 git push --delete origin
清理本地标签
git tag -l | xargs git tag -d
要从远程存储库中删除标签:
git push --delete origin TAGNAME
您也可以在本地删除标签:
git tag -d TAGNAME
从你的terminal,这样做:
git fetch git tags git tag -d {tag-name} git push origin :refs/tags/{tag-name}
现在去Github.com刷新,它们消失了。
只要注意,如果你有一个名为远程标签的远程分支,这些命令是不明确的:
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>'
如果您在Git仓库中创build了一个名为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标签手册页对如何有礼貌地向远程仓库的其他用户通知更改有一个很好的解释。 他们甚至给出了一个方便的公告模板,用于沟通别人应该如何改变。
简单的脚本从本地和原始位置删除给定的标签。 检查标签是否真的存在。
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
如何使用:
- 创buildshell脚本文件(例如git-tag-purge.sh)并粘贴内容。
- chmod你的脚本文件,使其可执行。
- 使脚本全局可用
- cd到你的git项目
- 调用脚本(例如
$> git-tag-purge.sh tag_name
)
似乎xargs
已经做了很多工作。 通过这个线程回顾一下,我猜测你所经历的xargs
的慢度是因为原来的答案在没有真正需要的时候使用了xargs -n 1
。
这相当于你的方法,除了xargs
自动处理最大的命令行长度:
git tag | sorting_processing_etc | xargs git push --delete origin
xargs
也可以并行运行进程。 方法2与xargs
:
git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin
上面最多使用5个进程来处理每个进程中最多100个参数。 您可以尝试使用这些参数来找出最适合您的需求。
数千个远程标签的速度可达100倍
在阅读这些答案的同时需要删除超过11000个标签,我才知道这些方法依赖或xargs
花费的时间太长,除非你有几个小时才能完成刻录。
挣扎着,我find了两个更快的方法。 对于这两个,首先使用git tag
或git ls-remote --tags
来制作一个你想在远程删除的标签列表。 在下面的例子中,你可以用你想要的任何grep
, sort
, tail
或head
来省略或replacesorting_proccessing_etc
( 例如 grep -P "my_regex" | sort | head -n -200
等 ):
第一种方法是最快的,比使用xargs
快20到100倍 ,而且一次只能处理至less几千个标签。
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
没有推送到每个远程ref,擦除它(正常的格式推这种方式是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 " ")
如果您使用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的build议,我已经从我的原来分裂这个答案:
这是一个比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
我想删除除了那些匹配模式的标签以外的所有标签,这样我就可以删除除了过去几个月的产品标签以外的所有标签,以下是我曾经取得的巨大成功:
删除所有远程标签并从删除中排除expression式
git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin
删除所有本地标记并从删除中排除expression式
git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d