提示:在继续阅读之前,请注意此文章最后更新于 2080 天前,其中的部分内容可能已经无效或过时。
前言
需求是删除一个lerna项目的tag。由于lerna的机制。lerna是通过拉取最近一次的tag对应的commit来判断哪些状态改变了。有关信息可以在另一篇关于lerna的blog里看到。所以会有很多由lerna提交的tag。但是这不是预期的,预期的是希望只有自己每次在发版的时候打的记录tag。
tag相关的操作
1.添加tag
# 轻量标签。没有打标签者、时间、附注信息等。
git tag [tagname]
# 附注标签
git tag -a [tagname] -m [附注信息]
#使用git show [tagname]来查看详细信息。轻量标签只有提交信息。
# 将本地tag推到远程仓库
git push origin [tagname]
# 推送全部本地tag到远程仓库(只会推远程仓库没有的)
git push origin --tags
区别如图:

2.删除tag
# 删除本地tag
git tag -d [tagname]
# 删除远程仓库的tag
git push origin :refs/tags/[tagname] # git push origin :[tagname]也可以。
# 更直观的删除远程标签的方式是
git push origin --delete [tagname]
3.查看tag
# 除了上面提到git show查看具体的tag(其实应该是查看提交)外,还可以
git tag # 从形式上来看等同于git tag -l(--list)
# 如果要列出对应的commit id的话,要使用下面的命令。并且上面提到的有些批量删除远程仓库的时候会有问题,这个时候就要使用这个命令配合上方面的(git push origin :refs/tags/[tagname])使用。下面会提到
git show-ref --tags
# 查看远程仓库的tag
git ls-remote --tags origin
4.xargs
参见:xargs 命令教程这篇教程已经讲的非常清楚了。这里罗列一下我觉得实用的几个参数:
- -I 指定每一项命令行参数的替代字符串
- -t 打印执行的命令
- --max-procs 使用多进程。会快一些。0表示不限进程数
5.删除所有的tag
很不幸的是,git好像并没有提供这么一个命令删除所有的tag。这个时候就要用到xargs
和管道符|
配合使用了。
# 删除本地所有tag
git tag -l | xargs -t git tag -d
# 如果要一条条的删除的话(会比较慢,可以配合多进程使用)
git tag -l | xargs -I {} git tag -d {}
这个比较简单,只要把所有的tag列出来作为输入传到xargs那边。就可以删除所有的tag。上面的{}只是占位符。可以换成任意的,比如'AAA'。相当于一个变量。
6.删除远程仓库所有的tag 有了上面的基础,就很简单了,只是命令换了一下
#1 这个命令比较直观,且易于处理
git tag -l | xargs -t git push origin delete
#2 或 这行命令就比较慢,好处在于不用处理在每个标签前分别加上':'
git tag -l | xargs -I {} git push origin :{}
# 如果要使用1中命令,且不使用delete命令的话,就需要使用awk给每一项加上个':'
git tag -l | awk '{print ":" $0}' | git push origin
# 上面的几种必须保证远程仓库有的tag,本地也有。因此要拉取到所有远程仓库的tag。如果想直接用远程仓库的tag来删除的话,可以用下面这种
git ls-remote --tags origin | awk '! /{}/ {print ":" $2}' | xargs -t git push origin
上面的最后一种方式,首先列出远程仓库所有的tag作为输入,但是由于列出的每一个tag都会有一个重复的带有^{}
的。所以用正则筛选一下,然后打出第二例,但是这种ref/tags/[tagname]形式的,只能用:
来操作,不能用delete。
实操
最终还是要应用到实际中的,最终如下:
git show-ref --tag | awk '/@[0-9].[0-9].[0-9]{0,3}/ {print ":" $2}' | xargs git push ${gitUrl}
但是最终还是有点问题。会把所有匹配到的lerna提交的tag都删除掉。无法保留最近的几个。且git tag -l查询的列表是按照字母来的。所以目前还是没有太好的思路。
参考:GIT 打标签
批量删除git 本地分支、远程分支、tag
git 如何同步本地、远程的分支和tag信息
Git批量删除远程的tag