如何删除远程标签?

mar*_*son 3121 git git-tag

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

Ada*_*nco 5216

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

git push origin :tagname
Run Code Online (Sandbox Code Playgroud)

或者,更明确地,使用该--delete选项(或者-d如果您的git版本早于1.8.0):

git push --delete origin tagname
Run Code Online (Sandbox Code Playgroud)

如果您还需要删除本地标记,请使用:

git push origin :refs/tags/tagname
Run Code Online (Sandbox Code Playgroud)

背景

将分支,标记或其他引用推送到远程存储库涉及指定"推送位置,源位置,目标位置?"

git tag --delete tagname
Run Code Online (Sandbox Code Playgroud)

将主分支推送到原始主分支的真实示例是:

git push remote-repo source-ref:destination-ref
Run Code Online (Sandbox Code Playgroud)

由于默认路径,可以缩短为:

git push origin refs/heads/master:refs/heads/master
Run Code Online (Sandbox Code Playgroud)

标签的工作方式相同:

git push origin master:master
Run Code Online (Sandbox Code Playgroud)

这也可以缩短为:

git push origin refs/tags/release-1.0:refs/tags/release-1.0
Run Code Online (Sandbox Code Playgroud)

通过省略源ref(冒号前的部分),将'nothing'推送到目标,删除远端的ref.

  • +1回答问题并解释一般情况,并详细说明未删节语法的含义 (166认同)
  • 如果有人想知道如何一次删除多个标签,你可以使用空格简单地列出它们,例如`git push --delete origin tag1 tag2`.同样适用于本地标签删除`git tag -d tag1 tag2` (71认同)
  • 对.顺便说一下,这也适用于分支机构. (17认同)
  • 如果标签名称与分支名称冲突,您最终可能会删除分支.哈哈.看到第二个答案 - 它更具生态性 (8认同)
  • 知道 `git tag -d \`git tag\`` 将删除所有本地标签也很有趣。同样适用于`git push --delete origin \`git tag\`` 假设您在本地拉取了远程标签。这在测试环境中很方便。 (2认同)
  • 事实上,我们有 6700 多个赞成票,而且它如此复杂,这可能意味着它可以重新设计。 (2认同)

小智 350

更简单的方法是

git push --delete origin YOUR_TAG_NAME
Run Code Online (Sandbox Code Playgroud)

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

  • 这有效.另外一个:如果你有一个分支和一个同名的标签,你可以在你的标签名称之前加上"tag"这个词,以确保得到标签,而不是分支. (12认同)
  • 是的,这很简单而且有效.虽然我通过指定变量部分来澄清答案:`git push --delete origin"TAGNAME"`,其中TAGNAME是原始标记的名称. (10认同)
  • @andypaxo命令采用的是refspecs,正确的方法是在标签前面添加`refs/tags /`,如下所示:`refs/tags/v2.3.1`. (9认同)
  • 我认为这是正确的方法......其他语法看起来更像是黑客攻击. (4认同)
  • 对于那些在答案发布后很长时间阅读的人来说,当时(现已接受的)答案中没有此内容;后来,这个答案的内容被(非常狭窄地)建议编辑为已接受的内容。这是 Stack Overflow 的“最佳答案上升到顶级系统”有点失败的奇怪边缘情况之一,一方面我很高兴接受的答案有正确的信息,因为大多数读者不会看过去的最佳答案,但我对我们如何到达这里并不感到兴奋......我希望未来的读者不会认为这个答案只是复制/粘贴。 (2认同)

Ale*_*ean 201

如果您v0.1.0要删除远程标记,并且您的遥控器是origin,则只需:

git push origin :refs/tags/v0.1.0
Run Code Online (Sandbox Code Playgroud)

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

git tag -d v0.1.0
Run Code Online (Sandbox Code Playgroud)

请参阅Adam Franco的答案,解释Git不寻常:的删除语法.

  • 更好的答案,因为如果你有一个分支和一个被称为相同的标签,这也有效. (5认同)
  • @ChaimEliyah你有一个领先的斜线,也许这是你的问题 (3认同)
  • 这也适用于 jgit。:tag 速记不适用于 jgit (2认同)

小智 102

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

git tag -l | xargs git tag -d
git fetch
Run Code Online (Sandbox Code Playgroud)

删除所有远程标签

git tag -l | xargs -n 1 git push --delete origin
Run Code Online (Sandbox Code Playgroud)

清理本地标签

git tag -l | xargs git tag -d
Run Code Online (Sandbox Code Playgroud)

  • 如何从本地和远程存储库中删除所有标签。这就是我想要的,谢谢! (2认同)

Von*_*onC 87

git push --delete origin $TAGNAME是正确的方法(除了本地删除)。

但是:请确保使用 Git 2.31+(2021 年第一季度)。

git push $there --delete( man )应该被诊断为错误,但却变成了匹配的推送,并已在 Git 2.31 (Q1 2021) 中得到纠正。

请参阅Junio C Hamano ( )的提交 20e4164(2021 年 2 月 23 日)。(由Junio C Hamano 合并 -- --提交 1400458中,2021 年 2 月 25 日)gitster
gitster

push: 不变成--delete ''匹配推送

关注者:蒂尔曼·沃格尔

当我们将语法糖“ git push remote --deleteman <ref>添加到“ git pushman)作为规范man的同义词时: f517f1f处的语法(“ :man作为:foo的语法糖”,2009-12-30, Git v1.7.0-rc0 -- merge),我们不够仔细以确保它不为空。git push remotebuiltin-pushadd --delete<ref>

盲目地将“”重写--delete <ref>为“ :<ref>”意味着空字符串<ref>会导致refspec“ :”,这是要求“匹配”推送的语法,不会删除任何内容。

更糟糕的是,如果有可以快进的匹配参考,它们就会过早地发布,即使用户觉得它们还没有准备好被推出,这将是一场真正的灾难。


Ign*_*ers 52

这两个步骤效果很好:

# delete local tag '1.0.0'
git tag -d 1.0.0

# delete remote tag '1.0.0' (eg, GitHub version too)
git push origin :refs/tags/1.0.0
Run Code Online (Sandbox Code Playgroud)


And*_*rea 32

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

git push --delete origin TAGNAME
Run Code Online (Sandbox Code Playgroud)

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

git tag -d TAGNAME
Run Code Online (Sandbox Code Playgroud)


Bik*_*kas 26

删除单个标签:

# Local tag example:
git tag -d v1.0.0

# Remote tag example:
git push -d origin v1.0.0
Run Code Online (Sandbox Code Playgroud)

删除多个标签:

# 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
Run Code Online (Sandbox Code Playgroud)

删除与特定模式匹配的标签:

# Local tag example:
git tag -d $(git tag -l "*beta*")

# Remote tag example:
git push -d origin $(git tag -l "*beta*")
Run Code Online (Sandbox Code Playgroud)


Mah*_*alt 25

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

git fetch
git tags
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}
Run Code Online (Sandbox Code Playgroud)

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

  • git标签不是标签 (2认同)

Lye*_*UKH 16

删除本地标签'12345'

git tag -d 12345
Run Code Online (Sandbox Code Playgroud)

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

git push origin :refs/tags/12345
Run Code Online (Sandbox Code Playgroud)

替代方法

git push --delete origin tagName
git tag -d tagName
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


kok*_*abi 16

git tag -d your_tag_name
git push origin :refs/tags/your_tag_name
Run Code Online (Sandbox Code Playgroud)

第一行your_tag_name从本地存储库中删除,第二行从远程存储库中删除。现在your_tag已从本地和远程回购中完全删除,但是有时您可能需要删除由GitHub在发行版中手动起草的已删除标签。

  • 尽管此命令可以回答问题,但提供有关此代码为何和/或如何回答问题的其他上下文,可以改善其长期价值。[如何回答](https://stackoverflow.com/help/how-to-answer) (2认同)

Ale*_*nte 14

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

git push origin :tagname
git push --delete origin tagname
Run Code Online (Sandbox Code Playgroud)

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

git push origin :refs/tags/<tag>
Run Code Online (Sandbox Code Playgroud)

这一个删除分支:

git push origin :refs/heads/<branch>
Run Code Online (Sandbox Code Playgroud)

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

error: dst refspec <tagname> matches more than one.
error: failed to push some refs to '<repo>'
Run Code Online (Sandbox Code Playgroud)


Meg*_*hou 9

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

git tag -d release01 
git push origin :refs/tags/release01 
Run Code Online (Sandbox Code Playgroud)

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

hg tag --remove featurefoo
Run Code Online (Sandbox Code Playgroud)

请参考https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551


Ton*_*nyH 9

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

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

挣扎,我发现了两个更快的方法.对于两者,以git taggit ls-remote --tags要在遥控器上创建要删除的标签列表.在下面的例子中,你可以省略或替换sorting_proccessing_etc任何grepING,sort荷兰国际集团,tail荷兰国际集团和head荷兰国际集团想要( grep -P "my_regex" | sort | head -n -200 ):


第一种方法是迄今为止最快的,可能比使用速度快20到100倍xargs,并且一次最少使用几千个标签.

git push origin $(< git tag | sorting_processing_etc \
| sed -e 's/^/:/' | paste -sd " ") #note exclude "<" for zsh
Run Code Online (Sandbox Code Playgroud)

这是如何运作的?正常的,以行分隔的标记列表将转换为单行空格分隔标记,每个标记都:以此为前缀...

tag1   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3
Run Code Online (Sandbox Code Playgroud)

使用git push此格式标记不会任何内容推送到每个远程引用中,并将其删除(以这种方式推送的正常格式local_ref_path:remote_ref_path).

方法二在同一页面的其他地方作为单独的答案分解


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

git tag | sorting_processing_etc | xargs -L 1 git tag -d
Run Code Online (Sandbox Code Playgroud)

或类似于远程删除:

git tag -d $(< git tag | sorting_processing_etc | paste -sd " ")
Run Code Online (Sandbox Code Playgroud)


Chr*_*gue 9

如果您使用SourceTree(出色的Git GUI),则可以通过以下步骤轻松地执行此操作而无需命令行:

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

现在,您的YOUR_TAG_NAME将从本地存储库和所有远程存储中删除-不管是GitHub,BitBucket还是您作为该存储库的远程存储列出的其他任何位置。

同样,如果您在本地删除了一个标签,但未在远程起点上删除它,并且您想在各处删除它,那么只需创建一个新标签,该标签具有相同的名称,并在与起点相同的提交时附加。然后,重复上述步骤以删除所有地方。


s.h*_*sam 9

2023 年更新

\n

首先,从本地存储库中删除标签。\n要删除本地 Git 标签,请使用git tag带有-d选项的命令。

\n
git tag -d <tag_name>\n
Run Code Online (Sandbox Code Playgroud)\n

例如,如果您想删除v1.0提交列表中指定的本地标签,则可以运行。

\n
git tag -d v1.0\n
Run Code Online (Sandbox Code Playgroud)\n

如果删除成功,您可以看到类似以下的输出。

\n
Deleted tag 'v1.0' (was 808b598)\n
Run Code Online (Sandbox Code Playgroud)\n

使用 tag 命令和选项列出现有标签-l,以确保正确删除标签。

\n
git tag -l\n
Run Code Online (Sandbox Code Playgroud)\n

其次,从远程存储库中删除标记。\n要删除远程 Git 标记,请使用 \xe2\x80\x9cgit push\xe2\x80\x9d 命令和 \xe2\x80\x9c\xe2\x80\x93delete\xe2 \x80\x9d 选项并指定标签名称。

\n
git push --delete origin <tag_name>\n
Run Code Online (Sandbox Code Playgroud)\n

回到前面的例子,如果你想删除名为\xe2\x80\x9cv1.0\xe2\x80\x9d的远程Git标签,你可以运行。

\n
git push --delete origin v1.0\n
Run Code Online (Sandbox Code Playgroud)\n

如果删除成功,您可以看到类似以下的输出。

\n
To https://github.com/SCHKN/repo.git\n - [deleted]         v1.0\n
Run Code Online (Sandbox Code Playgroud)\n

要删除远程 Git 标签,请使用该git push命令并使用语法指定标签名称refs

\n
git push origin :refs/tags/<tag_name>\n
Run Code Online (Sandbox Code Playgroud)\n

回到示例,要删除名为 的标签v1.0,您将运行。

\n
git push origin :refs/tags/v1.0\n\n\nTo https://github.com/SCHKN/repo.git\n - [deleted]         v1.0\n
Run Code Online (Sandbox Code Playgroud)\n

为什么我们应该指定refs/tags而不是只指定标签名称?

\n

有时,您的标签可能与您的分支具有相同的名称。

\n

如果您尝试删除 Git 标签而不指定,refs/tags您将收到以下错误。

\n
git push origin :v1.0\n\n\nerror: dst refspec v1.0 matches more than one.\nerror: failed to push some refs to '<repository>'\n
Run Code Online (Sandbox Code Playgroud)\n

因此,您需要指定您正在尝试删除 Git 标签而不是 Git 存储库。

\n


Wap*_*ull 7

对于乌龟 git 用户来说,在数百个标签的规模下,您可以使用 UI 一次删除多个标签,但 UI 很好地隐藏在上下文菜单下。

在资源管理器窗口中右键单击 -> 浏览引用 -> 右键单击​​ ref/refmotes/name -> 选择“删除远程标记”

在此输入图像描述

请参阅https://tortoisegit.org/docs/tortoisegit/tgit-dug-browse-ref.html


Ric*_*ble 6

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

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


Ton*_*nyH 6

正如@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\"`
Run Code Online (Sandbox Code Playgroud)

parallel有许多操作模式,但通常并行化您给出的任何命令,同时允许您设置进程数限制.您可以更改--jobs 2参数以允许更快的操作,但我遇到Github的速率限制问题,目前是5000 /小时,但似乎也有未记录的短期限制.


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

git tag | sorting_processing_etc | xargs -L 1 git tag -d
Run Code Online (Sandbox Code Playgroud)

  • 如果你需要删除几千个标签,那么速度要快10到100倍 (2认同)

Luc*_*Fox 6

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

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

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin
Run Code Online (Sandbox Code Playgroud)

删除所有本地标记并从删除中排除表达式

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d
Run Code Online (Sandbox Code Playgroud)


小智 5

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

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
Run Code Online (Sandbox Code Playgroud)

如何使用:

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


rse*_*nna 5

如果您使用的是PowerShell,并且要删除其中一堆:

# Local tags:
git tag -l | foreach { git tag -d $_ }

# Remote tags:
git tag -l | foreach { git push --delete origin $_ }
Run Code Online (Sandbox Code Playgroud)

当然,您也可以在删除之前过滤它们:

git tag -l | Where-Object { $_ -like "build-*" } | foreach { git tag -d $_ }
Run Code Online (Sandbox Code Playgroud)