問題的提出
不管是什么版本管理工具,每一條提交記錄都會(huì)有一個(gè)對(duì)應(yīng)的版本號(hào),一般是一個(gè)整數(shù),git是一個(gè)hash字符串。不管怎樣,這個(gè)版本號(hào)是唯一的,有時(shí)候我們?cè)诔绦蜻\(yùn)行的時(shí)候會(huì)在日志里面輸出程序的版本號(hào),或者在命令行運(yùn)行的時(shí)候在控制臺(tái)中輸出當(dāng)前程序的版本號(hào)。一般而言,如果我們程序輸出的版本號(hào),與版本控制系統(tǒng)源碼對(duì)應(yīng)的版本號(hào)有關(guān)聯(lián)關(guān)系是最好不過的,這樣當(dāng)運(yùn)行的程序出現(xiàn)問題的時(shí)候,可以通過程序的版本號(hào),去源碼的版本控制系統(tǒng)中找到對(duì)應(yīng)的源碼進(jìn)行分析,也就是說我們知道當(dāng)前運(yùn)行的程序?qū)?yīng)在版本控制系統(tǒng)中的源碼。
通過git命令得到版本號(hào)
這里的使用環(huán)境是linux,我們的源碼客戶端是git,通過git命令我們可以得到當(dāng)前最新版本庫中的源碼版本,使用git log 命令的格式化輸出,可以得到每次提交結(jié)果中的各個(gè)部分,例如版本號(hào),提交時(shí)間,提交日志。git log 命令默認(rèn)情況下會(huì)輸出所有提交記錄的詳細(xì)信息,通過使用其提供的--pretty選項(xiàng)我們可以指定git log 輸出我們需要的部分,例如代表版本號(hào)的hash字符串部分。
git log --pretty=format:"%H"
輸出:
082472d159a9ccd72fe241319d120b1a3dd87283
59ab0468389b511d0949aaef4e5324277e1899ce
134cb39bbb64b203b146626776a56037bccb469f
395db26c60e2f3544ec85d62e6caef911e9b16df
a29c1f4b7d72bb636ea844fc2d2e70c6f49eb046
當(dāng)然我們也可以只輸出短hash即可,例如:
git log --pretty=format:"%h"
輸出:
082472d
59ab046
134cb39
395db26
a29c1f4
同樣我們的代碼提交時(shí)候的時(shí)間可以通過下面的格式得到,僅僅是修改format參數(shù)即可:
git log --format="%ct"
輸出:
1499330142
1499245162
1499244031
1499237075
1498813631
這里輸出的是所有提交記錄的Unix時(shí)間戳,我們要得到最新的一條,只需要加上參數(shù) -n 其中n為大于0的整數(shù),表示輸出log的前n次的提交記錄,例如:
git log -1 --format="%ct"
輸出:
1499330142
表示輸出最新的一次提交的提交時(shí)間戳。既然有了這些信息,我們就可以得到當(dāng)前最新的源碼各個(gè)部分的信息,其實(shí)最重要就是提交時(shí)間,以及版本號(hào)碼了,有了前面的命令使用,我們可以寫出下面的shell代碼:
1 2 3 4 5 6 7 8 | #!/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 |
將腳本內(nèi)容保存為 build.sh 每次提交源碼之后,直接運(yùn)行build.sh 腳本即會(huì)生成最新的頭文件,該頭文件被編譯到程序中,我們看到版本信息包含了最新的版本號(hào),提交時(shí)間,編譯時(shí)間。其中我們有一個(gè)模版文件,version.h.tmp,其內(nèi)容如下:
1 2 3 | #ifndef _VERSION_ #define _VERSION_ "MYVERSION" #endif |
運(yùn)行build.sh之后生成的version.h文件類似如下:
1 2 3 | #ifndef _VERSION_ #define _VERSION_ "version: 082472d commit: 2017-07-06 16:35:42 build: 2017-07-11 21:01:31" #endif |
在我們的源文件中直接使用 _VERSION_ 宏就可以啦,在git提交版本的時(shí)候我們應(yīng)該將version.h.tmp模版文件添加到版本控制系統(tǒng)中,而腳本生成的version.h由于每次build都會(huì)變化,可以忽略掉。
關(guān)于git log 命令的格式說明
我這里列出一份git log 更加全面的格式說明,供大家參考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | %H: commit hash %h: 縮短的commit hash %T: tree hash %t: 縮短的 tree hash %P: parent hashes %p: 縮短的 parent hashes %an: 作者名字 %aN: mailmap的作者名字 (.mailmap對(duì)應(yīng),詳情參照git-shortlog(1)或者git-blame(1)) %ae: 作者郵箱 %aE: 作者郵箱 (.mailmap對(duì)應(yīng),詳情參照git-shortlog(1)或者git-blame(1)) %ad: 日期 (-- date = 制定的格式) %aD: 日期, RFC2822格式 %ar: 日期, 相對(duì)格式(1 day ago) %at: 日期, UNIX timestamp %ai: 日期, ISO 8601 格式 %cn: 提交者名字 %cN: 提交者名字 (.mailmap對(duì)應(yīng),詳情參照git-shortlog(1)或者git-blame(1)) %ce: 提交者 email %cE: 提交者 email (.mailmap對(duì)應(yīng),詳情參照git-shortlog(1)或者git-blame(1)) % cd : 提交日期 (-- date = 制定的格式) %cD: 提交日期, RFC2822格式 %cr: 提交日期, 相對(duì)格式(1 day ago) %ct: 提交日期, UNIX timestamp %ci: 提交日期, ISO 8601 格式 %d: ref名稱 %e: encoding %s: commit信息標(biāo)題 %f: sanitized subject line, suitable for a filename %b: commit信息內(nèi)容 %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: 切換到藍(lán)色 %Creset: 重設(shè)顏色 %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). |
最后分享一個(gè)比較好的git log 格式輸出:
1 | git log --graph --pretty= format : '%Cred%h%Creset -%C(yellow)%d%Creset %cn %s %Cgreen(%cr)%Creset' --abbrev-commit -- date =relative |
其輸出效果如下:
http://www.cnblogs.com/wangqiguo/p/7191352.html