如何删除已推送的Git标记?


当前回答

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

在SourceTree中打开存储库选择并展开左侧的“标签”选项卡右键单击要删除的标记选择“删除YOUR_TAG_NAME”在验证窗口中,选择“从远程设备删除标记”

YOUR_TAG_NAME现在将从您的本地存储库和所有远程设备中删除,无论是GitHub、BitBucket,还是您列为该存储库远程设备的任何地方。

此外,如果您在本地删除了一个标记,但没有在远程源上删除,并且您想在任何地方删除它,那么只需创建一个新标记,该标记具有相同的名称,并在与源相同的提交时附加。然后,重复上述步骤删除所有位置。

其他回答

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

将以下内容添加到~/.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-DeleteMe
deleting tag v1.0-DeleteMe from remote/origin ausing command: git push --delete origin tagName;
To https://github.com/jsticha/pafs
 - [deleted]             v1.0-DeleteMe
deleting tag v1.0-DeleteMe from local using command: git tag -d tagName;
Deleted tag 'v1.0-DeleteMe' (was 300d3ef22)

要删除远程存储库上的标记,可以使用

git push <remote> :refs/tags/<tagname>

解释上述内容的方法是将其读取为空值,即冒号被推送到远程标记名称之前的值。

要从远程存储库中删除标记,请执行以下操作:

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

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

用于数千个远程标签的速度快100倍

在阅读了这些答案,同时需要删除11000多个标签之后,我了解到这些方法依赖于xargs,或者xargs耗时太长,除非你有几个小时可以燃烧。

在挣扎中,我找到了两种更快的方法。对于这两种情况,从git-tag或git-ls-remote-tag开始,列出要删除的远程标记。在下面的示例中,您可以省略sorting_processing_etc,或将其替换为所需的任何greping、sorting、tailing或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   becomes
tag2   ======>  :tag1 :tag2 :tag3
tag3

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

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


在这两种方法之后,您可能也希望删除本地标记。这要快得多,所以我们可以返回使用xargs和git标记-d,这就足够了。

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

或类似于远程删除:

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