git tag 的理解和版本管理的自动整合

微博中有很多 hash tag,其实来源于 Twitter,部分微信用户也会在自己的朋友圈文章中打 Hash tag,当然只是自己搜索有用,没有其他用处。

开发里有个说法:代码即文章,文章即代码;那当然是要把代码写得非常优雅才可以。 本文旨在通过 git tag 相关命令 ,对版本打标签的做法予以自动化集成到代码的 Web 界面,并能在 SaaS 情形下,让客户自己决定是否更新版本,一个鼠标点击即可完成版本升级。

先来讲一下 git 里面的两种 tag,一个叫 Annotation, 一个叫 Lightweight,我们姑且称为注释标签和轻量标签,前者带有很多 MetaData,后者则没有任何 MetaData,是跟随当前 commit 而来的。 我们先讲这个简单,也在刚开始把我们弄糊涂的轻量标签。

简单而言, 打标签是需要在代码 commit 完, push 之前做的一个步骤。 git tag -a TAGNAME 就是注释标签,没有 -a 就是轻量标签。举例

$ git commit README.md -m "先 commit 再  git tag v2.0.11"
$ git tag v2.0.11  // 添加轻量标签
$ git show v2.0.11  // 验证
commit 9cc9c4a32d581e1aed98b2378104f2d5e29c02bd (HEAD -> edu1.1, tag: v2.0.11)
$ git describe
v2.0.10-1-g9cc9c4a3
$ git show-ref --tags v2.0.11
9cc9c4a32d581e1aed98b2378104f2d5e29c02bd refs/tags/v2.0.11
$ git describe --tags
v2.0.11
$ git push  // push 代码 
$ git push origin tag v2.0.11  // push 标签

这里有一个困惑的地方就是 git describe 的输出, 没有 –tags 参数的时候,输出的其实是 v2.0.10-1-g9cc9c4a3,这是从上一个注释标签开始以来的标签。我们看下 git describe 的解释

The command finds the most recent tag that is reachable from a commit. If the tag points to the commit, then only the tag is shown. Otherwise, it suffixes the tag name with the number of additional commits on top of the tagged object and the abbreviated object name of the most recent commit. The result is a “human-readable” object name which can also be used to identify the commit to other git commands.

By default (without –all or –tags) git describe only shows annotated tags. For more information about creating annotated tags see the -a and -s options to git-tag(1).

有了对以上命令的理解,注释标签就很好解释了, 添加注释标签类似对代码 commit ,就是需要 -m 用来添加对标签的注释。 其他就是 push 的时候需要把标签一起 push 出去。

如果我们在以上一个完整的周期完成后,继续提交代码,但是遗忘了打标签,我们用 git describe 加和不加 --tags 可以看到区别:
$ git describe // 针对注释标签
v2.0.10-2-g54a3d4ca
$ git describe --tags  // 针对任意类型标签
v2.0.11-1-g54a3d4ca

我们可以用 $ git tag -l -n 3 列出所有的标签 ,3 表示输出最多3行注释
在 git 的新版本里,支持 sort
我们可以使用

git tag -l -n --sort="v:refname"

来对 v2.01 之类的版本号标签,根据版本号排序。在 sort 后面的变量前面加一个 减号,我们可以倒排序,这样,我们就可以自动生成 Release Notes 了

git tag -l -n --sort=-"v:refname"

删除远程标签:

$ git push --delete origin tagname

Vuejs 的版本管理, 可以直接用 npm version v1.x.x -m “版本注释” 直接推送, npm 会直接管理 git 版本号,然后用 $ git push origin master –follow-tags 就可以把代码和版本一并推送到代码库,然后在相应的代码文件里,直接调用 config.version 即可读取到 package.json 文件里,自定义的软件包的版本号了。

同样的对于小程序项目,没有 package.json 文件,我们可以手工创建一个:

然后,我们用同样的 npm version v1.2.3 -m “注释” 之类的打标签,然后用 git push origin master –follow-tags 把所有标签都 push 出去

后记, 每次打完标签, 要打很多字,而且 branch 的名字各不相同,写了一个 alias,放到 profile 里, 以后每次 commit 好代码,打完标签,只要敲 .push 就可以推送带标签的代码了:

alias .push='git push $(git remote|tail -1) $(git branch|awk '"'"'/^\*/ {print $NF}'"'"') $(git describe --tags)'
另外如果要查找当前目录下的版本库的顶层目录用:
$ git rev-parse --show-toplevel 

Go 语言动态追踪 git 的版本号,需要在编译时,传入版本号的变量:

ver=$(git describe --tags)
go install -ldflags "-X main.file_v=$ver" myprog.go
这里 file_v 是 main 函数里定义的变量 

作者: 甬洁网络

--移动互联网&物联网技术提供商