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


当前回答

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

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

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

其他回答

更直接的方法是

git push --delete origin YOUR_TAG_NAME

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

这里已经有很多很好的答案,但如果您需要删除所有标记,可以使用以下使用PowerShell的命令行:

foreach($tag in(git tag)){git tag-d$tag.Trim();git push origin:refs/tags/$tag}

在这里,我们得到所有标签的列表,删除每个本地标签,然后删除远程标签(在GitHub上测试)。

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

将以下内容添加到~/.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标签手册页的On Retagging部分很好地解释了如何礼貌地将更改通知远程回购的其他用户。他们甚至提供了一个方便的公告模板,用于传达其他人应该如何获得您的更改。

正如@CubanX所建议的,我将这个答案与我的原始答案分开:

这里有一种方法,它比xargs快几倍,并且可以通过调整进行扩展。它使用Github API(一种个人访问令牌),并并行利用该实用程序。

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/hr,但似乎也有未记录的短期限制。


在此之后,您可能还想删除本地标记。这要快得多,所以我们可以返回使用xargs和git标记-d,这就足够了。

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