git commit 的时候实现自动打git标签
一.需求背景:
为了实现基于Travis CI搭建Android自动打包发布工作流。
实现了这套自动化发布后,工作流程被简化成:
1.开发新功能,提交代码
2.通过git tag对代码打一个内测版的tag,在tag的描述中对写当前完成的功能
Tag提交后Travis CI会自动编译代码,生成APK文件并分发到Github和fir.im,Github和fir.im中会保持Tag的描述信息,分发完成后会有邮件通知所有参与测试的人员。而作为开发人员,只需要专注于对代码打好一个Tag就可以了。
因此这里存在一个现象:每次需要手动打标签,比较麻烦。因此希望找到一种办法实现自动打tag
二.相关知识简介
1.钩子(Hook)
钩子(Hook)是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
2.pre-commit
顾名思义’pre-commit‘,就是在代码提交之前做些东西,比如代码打包,代码检测,称之为钩子(hook)。
2.shell脚本
什么是 Shell 呢?
首先,shell 是英语「壳,外壳」的意思。你可以把它想象成嵌入在 Linux 这样的操作系统中的一个「微型编程语言」。
Shell 不像 C语言,C++,Java 等编程语言那么完整,但是 Shell 这门语言可以帮我们完成很多自动化任务,例如:保存数据,监测系统的负载,等等。
脚本(Script)是批处理文件的延伸,是一种纯文本保存的程序,一般来说的计算机脚本程序是确定的一系列控制计算机进行运算操作动作的组合,在其中可以实现一定的逻辑分支等。
三.实现方案:
因此选择在pre-commit中写shell脚本,在项目的.git\hooks中创建pre-commit文件,实现git commit 的时候实现自动打git标签的功能。
因为每次提交的tag不能相同,因此选择获取commit数量和之前tag的前三位拼接成为tag,具体tag自动生成算法,可以自己制定。
代码如下:
#!/bin/sh
tag=$(git describe --tags `git rev-list --tags --max-count=1`)
gitVersion=${tag##*.}
num=$(git rev-list HEAD --count)
echo $num
#gitVersion =${gitVersion:0:3}${num}
git tag -a ${gitVersion:0:3}${num} -m test
git push origin ${gitVersion:0:3}${num}