git自动获取版本号

解读Git操作与版本控制
rm -Rf log.txt //先删除,因为每次都会产生以个存放log的文件
git log --pretty=oneline >> log.txt //可列出代码的所有改动历史,将他保存到一个文件中
git_ver=`awk 'END{print NR}' log.txt`//统计上面文件有多少条记录取最后一个数据
echo "Git Version: $git_ver"//打印出版本告
sed -i '29s/.*/CZC_VERSION_CODE := V01.001.'$git_ver'/' build/core/version_defaults.mk
//替换build/core/version_defaults.mk文件中第29行
        CZC_VERSION_CODE := V03.001.2661
========CZC_VERSION_CODE := V01.001.'$git_ver'

转载于:https://my.oschina.net/u/183217/blog/133905

<think>我们正在讨论如何使用Git生成版本号,特别是用于编译版本号。根据引用内容,Git版本号通常使用提交的SHA-1哈希值,但40位太长,一般取前7位或8位。同时,我们可以使用Git命令如`git describe`来生成更友好的版本号。 步骤: 1. 获取Git版本信息:可以使用`git rev-parse --short HEAD`获取当前提交的短哈希值(默认7位),或者使用`git describe`生成包含标签和提交次数的版本号(如v1.0-2-gabc1234,表示距离标签v1.0有2次提交当前提交的短哈希为abc1234)。 2. 考虑脏工作目录:如果工作目录有未提交的修改,可以在版本号后面加上“-dirty”标识(使用`git describe --dirty`)。 3. 将版本号写入文件:通常我们需要将生成的版本号写入源代码中的一个文件(如头文件或配置文件),以便在编译时使用。 下面是一个示例脚本(适用于Linux/macOS或Windows的Git Bash环境): ```bash #!/bin/bash # 获取版本描述,使用标签、提交次数和短哈希,并包含脏标记 VERSION=$(git describe --tags --dirty --always) # 或者只使用短提交哈希 # VERSION=$(git rev-parse --short HEAD) # 创建版本头文件 echo "#ifndef VERSION_H" > src/version.h echo "#define VERSION_H" >> src/version.h echo >> src/version.h echo "#define GIT_VERSION \"$VERSION\"" >> src/version.h echo >> src/version.h echo "#endif // VERSION_H" >> src/version.h ``` 但是,引用[5]提到使用sed来替换模板文件,这样更灵活。我们可以创建一个模板文件(如version.h.template): ```c #ifndef VERSION_H #define VERSION_H #define GIT_VERSION "$FULL_VERSION" #endif // VERSION_H ``` 然后使用脚本替换: ```bash #!/bin/bash GIT_VERSION=$(git describe --tags --dirty --always) # 使用sed替换模板中的占位符 sed -e "s/\$FULL_VERSION/$GIT_VERSION/g" version.h.template > src/version.h ``` 注意:在Windows环境下,如果使用Git Bash,同样可以运行这个脚本。另外,在Visual Studio项目中,我们可以将生成版本号的步骤作为预生成事件(Pre-Build Event)来执行。 在VS中设置预生成事件: 1. 打开项目属性,选择“生成事件”->“预生成事件”。 2. 在命令行中,输入调用脚本的命令,例如: ```bash bash $(SolutionDir)scripts/generate_version.sh ``` 其中`$(SolutionDir)`是VS的宏,表示解决方案目录。 3. 确保脚本文件(generate_version.sh)具有可执行权限,并且Git Bash在系统路径中。 另一种方法是使用批处理文件(.bat)在Windows上运行,但需要确保Git命令可用。批处理脚本示例(generate_version.bat): ```batch @echo off setlocal set GIT_VERSION=unknown for /f "delims=" %%i in ('git describe --tags --dirty --always 2^>nul') do set GIT_VERSION=%%i echo #ifndef VERSION_H > src/version.h echo #define VERSION_H >> src/version.h echo. >> src/version.h echo #define GIT_VERSION "%GIT_VERSION%" >> src/version.h echo. >> src/version.h echo #endif // VERSION_H >> src/version.h endlocal ``` 这样,每次编译前都会生成最新的版本号。 注意事项: - 如果项目没有Git仓库,上述命令可能会失败,因此需要处理错误情况(如设置一个默认版本号)。 - 在多人协作项目中,确保所有开发人员都安装了Git并且可以在命令行中使用。 总结:使用Git命令获取版本号,通过脚本将其写入源代码文件,然后在编译时包含该文件即可。 根据引用[4],`git describe`可以生成更友好的版本号,它基于最近的标签和提交次数。例如,标签为v1.0,当前提交在标签之后有2次提交,且工作目录干净,则输出为v1.0-2-gabc123(其中abc123是短提交ID)。如果工作目录有修改,则加上-dirty后缀。 因此,推荐使用`git describe --tags --dirty --always`,因为它提供了更丰富的版本信息。 相关问题: 1. 如何在没有标签的Git仓库中生成版本号? 2. 在Windows平台上除了使用批处理脚本,还有哪些方法可以生成Git版本号? 3. 如何将Git版本号集成到CMake项目中?</think>### 如何使用 Git 生成版本号 在软件开发中,使用 Git 生成版本号的核心思路是通过 Git 命令获取仓库的提交信息,将其转换为简洁的版本标识符,并集成到编译过程中。以下是具体实现方法: --- #### 一、基础方法:获取提交哈希 最常用的版本号格式是取 Git 提交哈希值的前 7 位(通常可保证唯一性): ```bash # 获取当前提交的短哈希值(7位) git rev-parse --short HEAD # 输出示例:a1b2c3d ``` **集成到代码中**(以 C++ 为例): ```cpp // 编译前通过脚本生成 version.h #define GIT_VERSION "a1b2c3d" ``` --- #### 二、高级方法:使用 `git describe` `git describe` 可生成包含标签和提交距离的语义化版本号: ```bash git describe --tags --dirty --always ``` - `--tags`:包含最近的标签名 - `--dirty`:工作区有修改时自动添加后缀(如 `-dirty`) - `--always`:无标签时回退到提交哈希 **输出示例**: ``` v1.2.3-2-ga1b2c3d # 标签v1.2.3之后2次提交 a1b2c3d-dirty # 无标签且工作区有修改 ``` --- #### 三、自动化集成步骤 以 Windows + Visual Studio 为例: 1. **创建版本生成脚本**(`generate_version.bat`): ```batch @echo off set GIT_VERSION=unknown for /f "delims=" %%i in ('git describe --tags --dirty --always 2^>nul') do set GIT_VERSION=%%i echo #define GIT_VERSION "%GIT_VERSION%" > src/version.h ``` 2. **在 VS 中配置预生成事件**: - 项目属性 → 生成事件 → 预生成事件 - 命令行:`generate_version.bat` ![VS 预生成事件配置](https://example.com/vs-pre-build.png) [^1] 3. **代码中引用版本号**: ```cpp #include "version.h" std::cout << "Build: " << GIT_VERSION; // 输出:v1.0-2-ga1b2c3d ``` --- #### 四、跨平台注意事项 1. **Linux/macOS**:使用 Shell 脚本替换批处理 ```bash #!/bin/bash GIT_VERSION=$(git describe --tags --dirty --always) echo "#define GIT_VERSION \"$GIT_VERSION\"" > src/version.h ``` 2. **无 Git 环境的处理**: 添加错误回退逻辑(如将版本设为 `unknown`)避免编译失败。 --- #### 五、应用场景与优势 1. **精准追溯**:每个版本号对应唯一代码状态 2. **自动标记**:`--dirty` 参数防止发布未提交代码 3. **语义化版本**:通过标签关联发布版本(如 `v2.1.0-3-gabc123`) 4. **持续集成**:与 CI/CD 流程无缝集成 [^2][^3] > 关键提示:对于正式发布,建议通过 `git tag v1.0.0` 创建标签版本,此时 `git describe` 会输出干净的 `v1.0.0`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值