博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何删除远程标签?
阅读量:2289 次
发布时间:2019-05-09

本文共 7865 字,大约阅读时间需要 26 分钟。

你如何删除已被推送的Git标签?


#1楼

如果要删除远程标记v0.1.0 ,并且远程是origin ,那么只需:

git push origin :refs/tags/v0.1.0

如果您还需要在本地删除标记:

git tag -d v0.1.0

请参阅对Git不寻常的解释的解释:删除语法。


#2楼

更简单的方法是

git push --delete origin YOUR_TAG_NAME

在这种情况下,IMO前缀冒号语法有点奇怪


#3楼

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

在部分中的git tag手册页有一个很好的解释,说明如何礼貌地通知远程repo的其他用户有关更改。 他们甚至提供了一个方便的公告模板,用于沟通其他人应该如何获得更改。


#4楼

删除所有本地标记并获取远程标记列表

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

#5楼

要从远程存储库中删除标记:

git push --delete origin TAGNAME

您可能还想在本地删除标记:

git tag -d TAGNAME

#6楼

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

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

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

hg tag --remove featurefoo

请参考


#7楼

请注意,如果您有一个名为远程标记的远程分支,则这些命令是不明确的:

git push origin :tagnamegit push --delete origin tagname

因此,您必须使用此命令删除标记:

git push origin :refs/tags/

这一个删除分支:

git push origin :refs/heads/

如果没有,你会得到这样的错误:

error: dst refspec 
matches more than one.error: failed to push some refs to '
'

#8楼

从您的终端,执行以下操作:

git fetchgit tagsgit tag -d {tag-name}git push origin :refs/tags/{tag-name}

现在去Github.com刷新,它们就消失了。


#9楼

数千个远程标签的速度提高了100倍

在阅读完这些答案的同时需要删除超过11,000个标签时,我学会了依赖这些方法或xargs花了太长时间,除非你有几个小时的刻录。

挣扎,我发现了两个更快的方式。 对于两者,从git taggit ls-remote --tags以创建要在远程上删除的标记列表。 在下面的例子中,你可以省略或代替sorting_proccessing_etc任何grep ING, sort ING, tail荷兰国际集团或head荷兰国际集团想要( grep -P "my_regex" | sort | head -n -200 ):


第一种方法是最快的,可能比使用xargs20到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 )。

方法二作为单独的答案分解


在这两种方法之后,您可能也想要删除本地标记。 这要快得多,所以我们可以回到使用xargsgit tag -d ,这已经足够了。

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

或类似于远程删除:

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

#10楼

从本地和原始位置删除给定标记的简单脚本。 检查标签是否确实存在。

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

如何使用:

  • 创建shell脚本文件(例如-purge.sh)并粘贴内容。
  • chmod你的脚本文件,使其可执行。
  • 使脚本全局可用
  • cd到你的git项目
  • 调用脚本(例如
    $> git-tag-purge.sh tag_name

#11楼

似乎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个参数。 您可以尝试使用参数来找到最适合您需求的参数。


#12楼

如果您正在使用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 $_ }

#13楼

正如@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 /小时,但似乎也有一个无证件的短期限制。


在此之后,您可能也想要删除本地标签。 这要快得多,所以我们可以回到使用xargsgit tag -d ,这已经足够了。

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

#14楼

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

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

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

#15楼

删除本地标签'12345'

git tag -d 12345

删除远程标签'12345'(例如; GitHub版本)

git push origin :refs/tags/12345

替代方法

git push --delete origin tagNamegit tag -d tagName


#16楼

如果您有一个以字符开头的标签,例如#ST002 ,您可能会发现您无法使用普通模式删除。 即

git tag -d #STOO2

不会删除标记,而是将其包装在String Literal中

git tag -d "#ST002" or git tag -d '#ST002'

这将被删除。 希望它能帮助那些犯了使用来编写标签名称的人。


#17楼

这是一个本地测试用例,可以在本地测试它而不会弄乱远程:

~/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

#18楼

如果您使用SourceTree - 一个很棒的Git GUI - 那么您可以通过执行以下操作在没有命令行的情况下轻松完成此操作:

  1. 在SourceTree中打开您的存储库
  2. 选择并展开左侧的“标签”标签
  3. 右键单击要删除的标记
  4. 选择“删除YOUR_TAG_NAME”
  5. 在验证窗口中,选择“从遥控器中删除标签”

YOUR_TAG_NAME现在将从您的本地存储库和所有遥控器中删除 - 无论是GitHub,BitBucket,还是您列为该存储库远程的其他位置。

此外,如果您在本地删除了一个标记但未在远程源上删除它,并且您想要在任何地方删除它,那么只需创建一个具有相同名称的新标记,并将其附加到与原点相同的提交中。 然后,重复上述步骤以删除所有内容。


#19楼

您只需要将“空”引用推送到远程标记名称:

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。


#20楼

嗨,只是想分享一个我创建的别名,它做同样的事情:

将以下内容添加到〜/ .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)

#21楼

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/

你可能感兴趣的文章
NoSQL
查看>>
QT在linux上安装步骤
查看>>
QT程序HelloWorld
查看>>
QT程序打包发布
查看>>
SQLite数据库Hello World
查看>>
好书慢读
查看>>
《嵌入式资料整合共两辑》
查看>>
source insight 和 vs 快捷键汇总
查看>>
Linux系统操作自测题
查看>>
《Unix编程艺术》
查看>>
软件架构thread和Event
查看>>
软件调试书籍资料汇总
查看>>
c++和c混合编程--注释
查看>>
bash脚本实例
查看>>
后缀表达式的副作用
查看>>
C语言新标准C11
查看>>
C语言几个有意思的问题
查看>>
C语言的模块仓库
查看>>
Unix环境编程
查看>>
《C语言深度剖析》
查看>>