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


当前回答

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

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

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

其他回答

删除本地标记“12345”

git tag -d 12345

删除远程标记“12345”(例如,GitHub版本也是)

git push origin :refs/tags/12345

替代方法

git push --delete origin tagName
git tag -d tagName

如果您有一个远程标签v0.1.0要删除,并且您的远程标签是源,那么只需:

git push origin :refs/tags/v0.1.0

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

git tag -d v0.1.0

有关Git异常的解释,请参见Adam Franco的回答:删除语法。

更直接的方法是

git push --delete origin YOUR_TAG_NAME

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

似乎xargs已经做了很多工作。回顾这篇文章,我猜你所经历的xargs的缓慢是因为最初的答案使用了xargs-n 1,而实际上并不需要。

除了xargs自动处理最大命令行长度之外,这与方法1等效:

git tag | sorting_processing_etc | xargs git push --delete origin

xargs也可以并行运行进程。使用xargs的方法2:

git tag | sorting_processing_etc | xargs -P 5 -n 100 git push --delete origin

上面最多使用5个进程来处理每个进程中最多100个参数。你可以尝试这些论点,以找到最适合你的需求的东西。

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

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

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