無論是什麼版本管理工具,每一條提交記錄都會有一個對應的版本號,通常是一個整數,git是一個hash字符串。無論怎樣,這個版本號是惟一的,有時候咱們在程序運行的時候會在日誌裏面輸出程序的版本號,或者在命令行運行的時候在控制檯中輸出當前程序的版本號。通常而言,若是咱們程序輸出的版本號,與版本控制系統源碼對應的版本號有關聯關係是最好不過的,這樣當運行的程序出現問題的時候,能夠經過程序的版本號,去源碼的版本控制系統中找到對應的源碼進行分析,也就是說咱們知道當前運行的程序對應在版本控制系統中的源碼。linux
這裏的使用環境是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 更加全面的格式說明,供你們參考:
%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
其輸出效果以下: