我想从Git存储库中删除所有标记。我该怎么做呢?

使用git tag -d tagname在本地删除标签tagname,并使用git push——tags更新git provider上的标签。

我试着:

git tag -d *

但是我看到*表示当前目录中的文件。

$ git tag -d *
error: tag 'file1' not found.
error: tag 'file2' not found.
...

假设我有很多标签,我想全部删除它们。


当前回答

对于windows,这样做是为了删除远程标记:

git fetch --tags
git push origin --delete $(git tag -l)

其他回答

我必须删除带有前缀的标签

例如,我必须删除标签v0.0.1, v0.0.2, v0.0.3, v0.0.4, v0.0.5

git tag -d $(git tag -l "v0.0.*")

分解并解释上面的语句:

列出所有带有前缀的标签 Git标签-l "v0.0.*" 删除标签 Git标记-d $tag_names

这就是这个表述的原理

如果你的本地回购中没有这些标签,你可以删除远程标签,而不必把它带到本地回购。

git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete

不要忘记将“origin”替换为远程处理程序名称。

要删除所有本地标签,只需运行以下命令

git tag | xargs git tag -d

如果在执行上述命令删除本地标签后,还需要删除远端标签,可以执行以下命令

git ls-remote --tags --refs origin | cut -f2 | xargs git push origin --delete

注意:用远程处理程序替换原点

对于windows,这样做是为了删除远程标记:

git fetch --tags
git push origin --delete $(git tag -l)

我在任何地方都没有找到不需要每个标记调用git push的解决方案,所以我想出了这个变体,在我的情况下,它将运行时间从几个小时减少到几秒钟:

git push --delete origin $( git ls-remote --tags origin | awk '{print $2}' | grep -Ev "\^" | tr '\n' ' ')

解释

git push --delete origin $(...): Deletes a tag (or multiple) on origin $( git ls-remote --tags origin | awk '{print $2}' | grep -Ev "\^" | tr '\n' ' '): Creates a space delimited string of all tags git ls-remote --tags origin: Prints all tags on the remote origin ... | awk '{print $2}' | ...: Only prints the second column of the previous command output ... | grep -Ev "\^" | ...: Filters out unwanted refs/tags/mytag^{} variants (not sure where they come from) ... | tr '\n' ' ': Converts the list into a space delimited string

它利用了这样一个事实,即您可以在空格分隔的字符串中提供多个标记名称,因此它只调用git delete一次。