工作涉及多个项目,项目发版的时候需要打tag,比如上一个测试的tag是v2.0.1-sit
,那么下一个tag就是v2.0.2-sit
。但很多时候并不知道上一个tag是什么,就需要先git log --oneline
看下最后的tag,然后复制下来在打tag的时候用,步骤:
git log --oneline
- 找到tag,然后复制
- 按q退出log视图
- 开始打tag
能不能优化下步骤,提升下生产力?
我们是有输出tag的命令:git tags
,但是这个命令会输出历史所有的tag,而且顺序是从历史到现在的,tag有很多的时候根本看不过来。
偶然得知,有一个rev-list
命令可以反向时间顺序列出提交对象。这个功能很强大,这里我们只需要--tags
的参数:
1 | git rev-list --tags |
这样会倒序显示tag的hash,但是如果tag很多的时候,这个列表会输出很多的对象,我们可以加上--max-count
参数来限制条数:
1 | git rev-list --tag --max-count=1 |
这样我们会得到最新打的tag。。。。的hash,确定吗?
我们可以验证下这个hash是不是我们最后一个的tag的hash:
1 | git show 60938cced5db3a35ba6e773314ded6e5efaf28c8 |
Ok, 可以确认是我们想要的。
但是仅仅这样不行啊,我们获得这个hash有什么用?难道还需要专门去show一下???
我们需要加点料,可以使用git describe
命令。
describe
命令可以查找从提交开始可以访问的最新的标记。换句话说,它会从当前节点往后查找,找到第一个tag位置,如果当前节点的对象为tag,那么结果就显示tag的名字,否则返回tag名字以及tag之上的提交数量,以及当前提交的缩写hash后缀。
比如,我们有一个branch,上面有5个提交,两个tag:
1 | +--------+ +---------+ |
假如直接运行git describe --tags
,它会从现在往前去找第一个tag,输出:tag2-1-hash5
。
那么我们假如希望直接找到tag2呢?可以将tag2的hash传给命令:
1 | git describe --tags hash4 |
这样可以直接输出tag2
。
到这里是不是有点眉目了?你品,你细品。
组合前面的describe
和rev-list
命令,我们可以直接让它输出最近的一个tag:
1 | git describe --tags `git rev-list --tags --max-count=1` |
OK,现在我们可以找到最近的tag了。
但是,有个问题,这个查找和分支没关系,所以我们查找的可能是sit测试的tag,可以是prod的上线tag,那我们如何区别?
我们可以使用--grep
参数:
1 | git describe --tags `git rev-list --tags --grep prod --max-count=1` |
这样我们可以找出prod生产tag的最后一条tag了。
但是,作为一个处女座,我还有个问题,我们总不是每次都打这么长的一串命令的吧?这不合理。
嗯,我们可以加入git的配置里面,编辑.gitconfig
文件,在alias下面添加:
1 | sit-last-tag = ! git describe --tags `git rev-list --tags --grep prod --max-count=1` |
这样,我们只需要运行:
1 | git sit-last-tag |
即可获得sit测试的最后一个tag(输入git sit然后直接按tab还会自动完成哦)。
然后打tag的步骤:
git sit-last-tag
, 然后复制tag- 打tag。
4步 变 2步,指数级优化啊有没有!
嗯,满意~😊