将git版本号编译进程序

问题的提出

无论是什么版本管理工具,每一条提交记录都会有一个对应的版本号,通常是一个整数,git是一个hash字符串。无论怎样,这个版本号是惟一的,有时候咱们在程序运行的时候会在日志里面输出程序的版本号,或者在命令行运行的时候在控制台中输出当前程序的版本号。通常而言,若是咱们程序输出的版本号,与版本控制系统源码对应的版本号有关联关系是最好不过的,这样当运行的程序出现问题的时候,能够经过程序的版本号,去源码的版本控制系统中找到对应的源码进行分析,也就是说咱们知道当前运行的程序对应在版本控制系统中的源码。linux

经过git命令获得版本号

这里的使用环境是linux,咱们的源码客户端是git,经过git命令咱们能够获得当前最新版本库中的源码版本,使用git log 命令的格式化输出,能够获得每次提交结果中的各个部分,例如版本号,提交时间,提交日志。git log 命令默认状况下会输出全部提交记录的详细信息,经过使用其提供的--pretty选项咱们能够指定git log 输出咱们须要的部分,例如表明版本号的hash字符串部分。git

git log --pretty=format:"%H" shell

输出:bash

082472d159a9ccd72fe241319d120b1a3dd87283
59ab0468389b511d0949aaef4e5324277e1899ce
134cb39bbb64b203b146626776a56037bccb469f
395db26c60e2f3544ec85d62e6caef911e9b16df
a29c1f4b7d72bb636ea844fc2d2e70c6f49eb046app

固然咱们也能够只输出短hash便可,例如:工具

git log --pretty=format:"%h"ui

输出:spa

082472d
59ab046
134cb39
395db26
a29c1f4命令行

一样咱们的代码提交时候的时间能够经过下面的格式获得,仅仅是修改format参数便可:3d

git log --format="%ct" 

输出:

1499330142
1499245162
1499244031
1499237075
1498813631

这里输出的是全部提交记录的Unix时间戳,咱们要获得最新的一条,只须要加上参数 -n  其中n为大于0的整数,表示输出log的前n次的提交记录,例如:

git log -1 --format="%ct"

输出:
1499330142

表示输出最新的一次提交的提交时间戳。既然有了这些信息,咱们就能够获得当前最新的源码各个部分的信息,其实最重要就是提交时间,以及版本号码了,有了前面的命令使用,咱们能够写出下面的shell代码:

#!/bin/sh
commit_ts=`git log -1 --format="%ct"`
commit_time=`date -d@$commit_ts +"%Y-%m-%d %H:%M:%S"`
current_time=`date +"%Y-%m-%d %H:%M:%S"`
git_version=`git log -1 --format="%h"`
sed  s/MYVERSION/"version: $git_version commit: $commit_time build: $current_time"/g version.h.tmp > version.h
make clean
make

将脚本内容保存为 build.sh 每次提交源码以后,直接运行build.sh 脚本即会生成最新的头文件,该头文件被编译到程序中,咱们看到版本信息包含了最新的版本号,提交时间,编译时间。其中咱们有一个模版文件,version.h.tmp,其内容以下:

#ifndef _VERSION_
#define _VERSION_ "MYVERSION"
#endif

运行build.sh以后生成的version.h文件相似以下:

#ifndef _VERSION_
#define _VERSION_ "version: 082472d commit: 2017-07-06 16:35:42 build: 2017-07-11 21:01:31"
#endif

在咱们的源文件中直接使用 _VERSION_ 宏就能够啦,在git提交版本的时候咱们应该将version.h.tmp模版文件添加到版本控制系统中,而脚本生成的version.h因为每次build都会变化,能够忽略掉。

关于git log 命令的格式说明

我这里列出一份git log 更加全面的格式说明,供你们参考: 

%H: commit hash
%h: 缩短的commit hash
%T: tree hash
%t: 缩短的 tree hash
%P: parent hashes
%p: 缩短的 parent hashes
%an: 做者名字
%aN: mailmap的做者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%ae: 做者邮箱
%aE: 做者邮箱 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%ad: 日期 (--date= 制定的格式)
%aD: 日期, RFC2822格式
%ar: 日期, 相对格式(1 day ago)
%at: 日期, UNIX timestamp
%ai: 日期, ISO 8601 格式
%cn: 提交者名字
%cN: 提交者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%ce: 提交者 email
%cE: 提交者 email (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
%cd: 提交日期 (--date= 制定的格式)
%cD: 提交日期, RFC2822格式
%cr: 提交日期, 相对格式(1 day ago)
%ct: 提交日期, UNIX timestamp
%ci: 提交日期, ISO 8601 格式
%d: ref名称
%e: encoding
%s: commit信息标题
%f: sanitized subject line, suitable for a filename
%b: commit信息内容
%N: commit notes
%gD: reflog selector, e.g., refs/stash@{1}
%gd: shortened reflog selector, e.g., stash@{1}
%gs: reflog subject
%Cred: 切换到红色
%Cgreen: 切换到绿色
%Cblue: 切换到蓝色
%Creset: 重设颜色
%C(...): 制定颜色, as described in color.branch.* config option
%m: left, right or boundary mark
%n: 换行
%%: a raw %
%x00: print a byte from a hex code
%w([[,[,]]]): switch line wrapping, like the -w option of git-shortlog(1).

最后分享一个比较好的git log 格式输出:

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %cn %s %Cgreen(%cr)%Creset' --abbrev-commit --date=relative

其输出效果以下:
 git log 格式效果

相关文章
相关标签/搜索