代码管理较多的是使用svn、git这类的版本管理工具,版本号是一个重要的东西,自然地,如何让我们显式地看到版本号是十分重要的。一般地,会通过某种手段让当前代码的版本号声明为宏定义字符串,或打印在串口上,或传输到上位机显示。这里介绍了svn和git的版本号生成方式。
SVN生成编译版本号脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# file name: svn_local_ver_build.sh #!/bin/bash VER_FILE=version.h LOCALVER=`svn info | cat -n | awk '{if($1==5)print $3}'` echo "LOCALVER:" $LOCALVER VER=r$LOCALVER echo "Generated" $VER_FILE echo "#ifndef PROJECT_VERSION_H" > $VER_FILE echo "#define PROJECT_VERSION_H" >> $VER_FILE echo "" >> $VER_FILE echo "#define VERSION_NUMBER \"$VER\"" >> $VER_FILE echo "" >> $VER_FILE echo "#endif" >> $VER_FILE echo "Job done!!" |
方法:
先在SVN工作目录中查看SVN信息,再从这些信息中截取版本号,上面脚本中的命令语句执行得到下列结果:
1 2 3 4 5 6 7 8 9 10 11 12 |
latelee@latelee:mylib$ ls branches tags trunk latelee@latelee:mylib$ svn info | cat -n 1 路径: . 2 URL: https://latelee.org/svn/mylib3 版本库根: https://latelee.org/svn/mylib4 版本库 UUID: 1f5fb548-7608-e145-84f5-f0a17695809a 5 版本: 4 6 节点种类: 目录 7 调度: 正常 8 最后修改的作者: latelee 9 最后修改的版本: 4 10 最后修改的时间: 2012-03-02 11:31:59 +0800 (五, 2012-03-02) 11 |
awk ‘{if($1==5)print $3}’的意思是将第5行号的第3列打印出来。这个就是我们想要的版本号了。
GIT生成编译版本号脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# file name: git_local_ver_build.sh #!/bin/bash VER_FILE=version.h LOCALVER=`git rev-list HEAD | wc -l | awk '{print $1}'` echo "LOCALVER:" $LOCALVER VER=r$LOCALVER VER="$VER $(git rev-list HEAD -n 1 | cut -c 1-7)" GIT_VERSION=$VER echo "Generated" $VER_FILE echo "#ifndef PROJECT_VERSION_H" > $VER_FILE echo "#define PROJECT_VERSION_H" >> $VER_FILE echo "" >> $VER_FILE echo "#define VERSION_NUMBER \"$GIT_VERSION\"" >> $VER_FILE echo "" >> $VER_FILE echo "#endif" >> $VER_FILE echo "Job done!!" |
方法:
GIT的版本号是一个 40 位的 SHA-1 的哈希值,但我们不使用这个值作为版本号,r16比d51f6f0b5eb202bbe6204246187d35df43aa6ef8更容易看一些。我们先使用git rev-list HEAD命令打印所有GIT版本,再通过wc计数,得到的数字就是我们想要的版本号(万一版本号有10000个,不知道这样做好不好)。另外,我们在数字的版本号后面加上哈希值的前7位,这使得数字的版本号和哈希值的版本号对应起来。
生成的文件示例:
1 2 3 4 |
#ifndef PROJECT_VERSION_H #define PROJECT_VERSION_H #define VERSION_NUMBER “r16 d51f6f0″ #endif |
补记:可以在版本号添加分支名称,语句如下:
1 2 |
BRANCH=`git branch | awk '{if ($1=="*") print $2}'` GIT_VERSION="$VER $BRANCH" |
另一个较复杂的GIT生成编译版本号脚本:
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 |
# file name: git_build_version.sh #!/bin/bash VER_FILE=version.h git rev-list HEAD | sort > config.git-hash LOCALVER=`wc -l config.git-hash | awk '{print $1}'` echo "LOCALVER:" $LOCALVER if [ $LOCALVER \> 1 ] ; then VER=`git rev-list origin/master | sort | join config.git-hash - | wc -l | awk '{print $1}'` if [ $VER != $LOCALVER ] ; then VER="$VER+$(($LOCALVER-$VER))" fi if git status | grep -q "modified:" ; then VER="${VER}M" fi VER="$VER $(git rev-list HEAD -n 1 | cut -c 1-7)" GIT_VERSION=r$VER else GIT_VERSION= VER="x" fi rm -f config.git-hash echo "VER: " $VER echo "GIT_VERSION: " $GIT_VERSION echo "Generated" $VER_FILE echo "#ifndef PROJECT_VERSION_H" > $VER_FILE echo "#define PROJECT_VERSION_H" >> $VER_FILE echo "" >> $VER_FILE echo "#define VERSION_NUMBER \"$GIT_VERSION\"" >> $VER_FILE echo "" >> $VER_FILE echo "#endif" >> $VER_FILE echo "Job done!!" |
这个脚本需要join命令的支持,在windows上join.exe命令需要msys-iconv-2.dll、msys-intl-8.dll动态库的支持。如果安装了MinGW,可以从安装目录中直接获取。
本文所述方法存在bug,请参考《关于svn、git生成版本号脚本的改进》。
发表评论
要发表评论,您必须先登录。