當前位置:
首頁 > 知識 > 將git版本號編譯進程序

將git版本號編譯進程序

問題的提出

不管是什麼版本管理工具,每一條提交記錄都會有一個對應的版本號,一般是一個整數,git是一個hash字元串。不管怎樣,這個版本號是唯一的,有時候我們在程序運行的時候會在日誌裡面輸出程序的版本號,或者在命令行運行的時候在控制台中輸出當前程序的版本號。一般而言,如果我們程序輸出的版本號,與版本控制系統源碼對應的版本號有關聯關係是最好不過的,這樣當運行的程序出現問題的時候,可以通過程序的版本號,去源碼的版本控制系統中找到對應的源碼進行分析,也就是說我們知道當前運行的程序對應在版本控制系統中的源碼。

通過git命令得到版本號

這裡的使用環境是linux,我們的源碼客戶端是git,通過git命令我們可以得到當前最新版本庫中的源碼版本,使用git log 命令的格式化輸出,可以得到每次提交結果中的各個部分,例如版本號,提交時間,提交日誌。git log 命令默認情況下會輸出所有提交記錄的詳細信息,通過使用其提供的--pretty選項我們可以指定git log 輸出我們需要的部分,例如代表版本號的hash字元串部分。

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

輸出:

082472d159a9ccd72fe241319d120b1a3dd87283

59ab0468389b511d0949aaef4e5324277e1899ce

134cb39bbb64b203b146626776a56037bccb469f

395db26c60e2f3544ec85d62e6caef911e9b16df

a29c1f4b7d72bb636ea844fc2d2e70c6f49eb046

當然我們也可以只輸出短hash即可,例如:

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

輸出:

082472d

59ab046

134cb39

395db26

a29c1f4

同樣我們的代碼提交時候的時間可以通過下面的格式得到,僅僅是修改format參數即可:

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版本號編譯進程序

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

webgl自學筆記——幾何圖形
「LeetCode」Wildcard Matching 題解
監聽剪貼板更新
TP5 資料庫的增刪改查

TAG:達人科技 |

您可能感興趣

圖解教程——並行矩量法程序在Windows的編譯
自製Monkey編程語言編譯器:增加數組操作API和Mapsh數據類型
Flutter 的編譯模式
GitHub Actions 集成 CI/CD 功能,推進開發編譯測試部署流程自動化
GitHub Actions 集成CI/CD功能,推進開發編譯測試部署流程自動化
Unity編譯器測試框架
NDK FFmpeg 編譯
ApkTool安卓反編譯教程
php+Swoole——編譯安裝
Linux 程序編譯過程的來龍去脈
Windows 版本的 Chrome 停用微軟的編譯器 改用 Clang
編譯谷歌瀏覽器Chrome
棄用微軟 C+編譯器,Win版Chrome 改用 Clang
Android-IMX6Q源碼編譯
gcc/g++ 鏈接庫的編譯與鏈接
在JFinal中新建一個sql文件編譯不通過
vivo Z5x將首發ART+Turbo編譯增強技術
解決ReactOS Dev編譯之後功能殘缺問題
C sharp 翻身?微軟重寫開源的 C sharp 編譯器!
TVM: Deep Learning模型的優化編譯器(強烈推薦, 附踩坑記錄)