本文共 7865 字,大约阅读时间需要 26 分钟。
你如何删除已被推送的Git标签?
如果要删除远程标记v0.1.0
,并且远程是origin
,那么只需:
git push origin :refs/tags/v0.1.0
如果您还需要在本地删除标记:
git tag -d v0.1.0
请参阅对Git不寻常的解释的解释:
删除语法。
更简单的方法是
git push --delete origin YOUR_TAG_NAME
在这种情况下,IMO前缀冒号语法有点奇怪
其他答案指出了如何实现这一点,但你应该记住后果,因为这是一个远程存储库。
在部分中的git tag手册页有一个很好的解释,说明如何礼貌地通知远程repo的其他用户有关更改。 他们甚至提供了一个方便的公告模板,用于沟通其他人应该如何获得更改。
删除所有本地标记并获取远程标记列表 :
git tag -l | xargs git tag -dgit 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
如果您在Git存储库中创建了一个名为release01
的标记,则可以通过执行以下操作将其从存储库中删除:
git tag -d release01 git push origin :refs/tags/release01
要从Mercurial存储库中删除一个:
hg tag --remove featurefoo
请参考
请注意,如果您有一个名为远程标记的远程分支,则这些命令是不明确的:
git push origin :tagnamegit push --delete origin tagname
因此,您必须使用此命令删除标记:
git push origin :refs/tags/
这一个删除分支:
git push origin :refs/heads/
如果没有,你会得到这样的错误:
error: dst refspecmatches more than one.error: failed to push some refs to ' '
从您的终端,执行以下操作:
git fetchgit tagsgit tag -d {tag-name}git push origin :refs/tags/{tag-name}
现在去Github.com刷新,它们就消失了。
在阅读完这些答案的同时需要删除超过11,000个标签时,我学会了依赖这些方法或xargs
花了太长时间,除非你有几个小时的刻录。
挣扎,我发现了两个更快的方式。 对于两者,从git tag
或git ls-remote --tags
以创建要在远程上删除的标记列表。 在下面的例子中,你可以省略或代替sorting_proccessing_etc
任何grep
ING, sort
ING, 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
这是如何运作的? 正常的,以行分隔的标记列表将转换为单行空格分隔标记,每个标记前缀为:
so。 。 。
tag1 becomestag2 ======> :tag1 :tag2 :tag3tag3
使用带有此格式标记的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 " ")
从本地和原始位置删除给定标记的简单脚本。 检查标签是否确实存在。
if [ $(git tag -l "$1") ]; then git tag --delete $1 git push --delete origin $1 echo done.else echo tag named "$1" was not foundfi
如何使用:
$> 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个参数。 您可以尝试使用参数来找到最适合您需求的参数。
如果您正在使用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
快几倍的方法,并且可以通过调整进行更多扩展。 它使用 ,一个个人访问令牌,并利用实用程序。 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\"`
有许多操作模式,但通常并行化您给出的任何命令,同时允许您设置进程数限制。 您可以更改--jobs 2
参数以允许更快的操作,但我有Github的 ,目前是5000 /小时,但似乎也有一个无证件的短期限制。
在此之后,您可能也想要删除本地标签。 这要快得多,所以我们可以回到使用xargs
和git tag -d
,这已经足够了。
git tag | sorting_processing_etc | xargs -L 1 git tag -d
我想删除所有标签,除了那些与模式匹配的标签,这样我就可以删除除了最后几个月的生产标签之外的所有标签,这是我以前取得的巨大成功:
删除所有远程标记并从删除中排除表达式
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
git tag -d 12345
git push origin :refs/tags/12345
git push --delete origin tagNamegit tag -d tagName
如果您有一个以#字符开头的标签,例如#ST002
,您可能会发现您无法使用普通模式删除。 即
git tag -d #STOO2
不会删除标记,而是将其包装在String Literal中
git tag -d "#ST002" or git tag -d '#ST002'
这将被删除。 希望它能帮助那些犯了#使用#来编写标签名称的人。
这是一个本地测试用例,可以在本地测试它而不会弄乱远程:
~/p $ mkdir gittest ~/p/git $ cd gittest/~/p/gittest $ git initInitialized empty Git repository in /Users/local_user/p/gittest/.git/ ~/p/gittest $ touch testfile.txt ~/p/gittest $ git add testfile.txt ~/p/gittest $ git commit -m "initial commit"[master (root-commit) 912ce0e] initial commit 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 testfile.txt ~/p/gittest $ git tag ~/p/gittest $ git tag -a testtag ~/p/gittest $ git tagtesttag ~/p/gittest $ git show-ref912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/masterb0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag ~/p/gittest $ cd .. ~/p $ mkdir gitbare ~/p $ cd gitbare ~/p/gitbare $ git init --bareInitialized empty Git repository in /Users/local_user/p/gitbare/ ~/p/gitbare $ cd .. ~/p $ cd gittest/ ~/p/gittest $ git remote add origin /Users/local_user/p/gitbare ~/p/gittest $ git push -u origin masterCounting objects: 3, done.Writing objects: 100% (3/3), 215 bytes | 215.00 KiB/s, done.Total 3 (delta 0), reused 0 (delta 0)To /Users/local_user/p/gitbare * [new branch] master -> masterBranch 'master' set up to track remote branch 'master' from 'origin'. ~/p/gittest $ git push origin testtagCounting objects: 1, done.Writing objects: 100% (1/1), 163 bytes | 163.00 KiB/s, done.Total 1 (delta 0), reused 0 (delta 0)To /Users/local_user/p/gitbare * [new tag] testtag -> testtag ~/p/gittest $ git show-ref912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/masterb0a6c15cabb990e6d6c46f762891b63608d962f3 refs/tags/testtag ~/p/gittest $ git push -d origin testtagTo /Users/local_user/p/gitbare - [deleted] testtag ~/p/gittest git tag -d testtagDeleted tag 'testtag' (was b0a6c15) ~/p/gittest $ git show-ref912ce0e40635c90241fdab756dce7ea34938de57 refs/heads/master912ce0e40635c90241fdab756dce7ea34938de57 refs/remotes/origin/master ~/p/gittest
如果您使用SourceTree - 一个很棒的Git GUI - 那么您可以通过执行以下操作在没有命令行的情况下轻松完成此操作:
YOUR_TAG_NAME现在将从您的本地存储库和所有遥控器中删除 - 无论是GitHub,BitBucket,还是您列为该存储库远程的其他位置。
此外,如果您在本地删除了一个标记但未在远程源上删除它,并且您想要在任何地方删除它,那么只需创建一个具有相同名称的新标记,并将其附加到与原点相同的提交中。 然后,重复上述步骤以删除所有内容。
您只需要将“空”引用推送到远程标记名称:
git push origin :tagname
或者,更--delete
,使用--delete
选项(如果您的git版本早于1.8.0,则使用-d
):
git push --delete origin tagname
请注意,git具有标记命名空间和分支命名空间,因此您可以对分支和标记使用相同的名称。 如果要确保不会意外删除分支而不是标记,则可以指定永不删除分支的完整引用:
git push origin :refs/tags/tagname
如果您还需要删除本地标记,请使用:
git tag --delete tagname
将分支,标记或其他引用推送到远程存储库涉及指定“哪个存储库,哪个源,哪个目标?”
git push remote-repo source-ref:destination-ref
将主分支推送到原始主分支的真实示例是:
git push origin refs/heads/master:refs/heads/master
由于默认路径,可以缩短为:
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。
嗨,只是想分享一个我创建的别名,它做同样的事情:
将以下内容添加到〜/ .gitconfig中
[alias] delete-tag = "!f() { \ echo 'deleting tag' $1 'from remote/origin ausing command: git push --delete origin tagName;'; \ git push --delete origin $1; \ echo 'deleting tag' $1 'from local using command: git tag -d tagName;'; \ git tag -d $1; \ }; f"
用法如下:
-->git delete-tag v1.0-DeleteMedeleting tag v1.0-DeleteMe from remote/origin ausing command: git push --delete origin tagName;To https://github.com/jsticha/pafs - [deleted] v1.0-DeleteMedeleting tag v1.0-DeleteMe from local using command: git tag -d tagName;Deleted tag 'v1.0-DeleteMe' (was 300d3ef22)
git tag -d your_tag_namegit push origin :refs/tags/your_tag_name
第一行从本地your_tag_name
删除your_tag_name
,第二行从远程your_tag_name
删除它。 现在your_tag已经完全删除,包括本地和远程仓库,但有时您可能需要删除GitHub手动在您的发布部分中删除的已删除标记。
转载地址:http://pvdnb.baihongyu.com/