C++如何获取当前代码的Git提交版本号

酷敏小哥_9764

酷敏小哥_9764

2026-06-02

551人浏览

原创

最可靠方式是在cmake构建阶段用execute_process执行git describe --always --dirty获取版本号,通过configure_file注入version.h头文件,并确保add_dependencies强制每次重建;避免运行时调用git。

c++如何获取当前代码的git提交版本号

编译时通过shell命令注入Git版本号

最可靠的方式不是运行时调用 git 命令(可能没装、路径不对、子模块混乱),而是在构建阶段把版本信息作为预处理器宏或源文件内容写进去。CMake是最常见的载体,它能安全执行 git describe --always --dirty 并生成头文件。

  • 在 CMakeLists.txt 中添加:
    execute_process(COMMAND git describe --always --dirty
      WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
      OUTPUT_VARIABLE GIT_VERSION
      OUTPUT_STRIP_TRAILING_WHITESPACE
      ERROR_QUIET)
    configure_file("${CMAKE_SOURCE_DIR}/version.h.in" "${CMAKE_BINARY_DIR}/version.h")
  • 准备 version.h.in:
    #define GIT_VERSION "@GIT_VERSION@"
  • 确保编译时包含生成的 version.h 路径:
    include_directories(${CMAKE_BINARY_DIR})

运行时读取嵌入的版本字符串(不推荐但可行)

如果坚持运行时获取,std::system 或 popen 调用 git 是高风险操作:工作目录可能不是项目根目录,git 可能不可用,子进程失败无提示。更稳妥的做法是只在开发/测试环境启用该逻辑,并加 fallback。

  • 用 popen 获取输出(Linux/macOS):
    FILE* fp = popen("git -C /path/to/repo describe --always --dirty 2>/dev/null", "r");
  • 必须显式指定 -C 参数,否则当前工作目录不确定
  • Windows 下需改用 _popen,且 git 必须在 PATH 中,否则返回空
  • 永远要检查 fp 是否为 nullptr,并限制读取长度防止缓冲区溢出

git describe 输出格式与语义差异

git describe 的结果不是固定格式,取决于仓库状态,直接字符串匹配容易出错。常见输出包括:v1.2.3-5-gabc123(距最近 tag 5 次提交)、v1.2.3(正好在 tag 上)、abc123(无 tag)、v1.2.3-dirty(工作区已修改)。这些都需要按需解析。

GitHub Iteration Workflow
GitHub Iteration Workflow

GitHub Issue 全流程自动化:自动拉取、修复 Issue,创建 PR,监控 CI/CD,合并部署。

下载
  • --always 确保即使无 tag 也返回 commit hash,避免命令失败
  • --dirty 标记工作区是否修改,但不会告诉你哪些文件脏——仅作发布校验用
  • 若需语义化版本,建议配合 git tag -l "v[0-9]*" 和正则提取主版本号,而非硬切分字符串
  • CI 环境中 git clone 默认是 shallow 的,git describe 可能找不到足够远的 tag;需提前 git fetch --unshallow 或用 --tags

静态链接时版本号“冻结”在二进制里的坑

版本号一旦写进可执行文件,就和构建时刻绑定。如果构建脚本没强制更新,或者缓存了中间产物(如 CMake 的 build/ 目录重用),你拿到的可能是几天前的 commit ID。

  • 在 CMake 中对 version.h.in 添加依赖:
    set_property(DIRECTORY PROPERTY INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR})
    add_custom_target(git_version DEPENDS ${CMAKE_BINARY_DIR}/version.h)
    add_dependencies(your_target git_version)
  • 确保每次构建都重新执行 execute_process,而不是靠 configure_file 的时间戳判断
  • 发布包构建应使用 clean build dir,避免残留旧 version.h
  • 调试时可用 strings your_binary | grep -E 'v[0-9]|^[a-f0-9]{7,}$' 快速验证是否注入成功

Git 版本号看似只是个字符串,但它绑定了构建环境、仓库状态、CI 配置三者的一致性。最容易被忽略的是:没有 tag 时 git describe 默认失败,而很多人只在本地有 tag 的机器上验证过。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

git c++ cmake

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2208

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

979

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

407

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

386

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

580

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1197

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
vscode手册
vscode手册

共0课时 | 0人学习

Git 教程
Git 教程

共21课时 | 7.9万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.8万人学习