在 C/C++ 源代码中包含 Git 提交哈希和/或分支名称

2023-11-25

我想知道如何将 Git 提交哈希和/或其他信息获取到已编译二进制文件中 C++ 变量的内容中,而不使其成为 Git 跟踪的源代码的一部分。

我需要跟踪在嵌入式处理器上运行的已编译可执行文件中的固件版本信息。在这种封闭环境(即没有文件系统)中,无法识别固件二进制文件的特定版本,例如有意义的文件名、MD5 校验和甚至日期/时间戳。

一种方法是让设备的控制台输出生成识别文本,例如“Release 1.2.3”、“commit hash 1bc123...”或类似文本。固件版本信息仅对维护人员感兴趣,因此经过培训的操作员可以检查控制台输出。为了实现这一点,可能需要手动编辑版本字符串,然后将其编译到代码中并在程序启动时输出到控制台。

对于使用签核工作流程来仔细检查版本信息是否正确的主要版本来说,这是可以接受的。然而,这是一个手动过程,本质上是不可靠的。例如,如果开发者忘记更新版本信息怎么办? - 现在编译的代码与其报告的版本字符串之间存在脱节。

每次用户想要测试硬件时重新编译和下载代码的工作流程在所讨论的情况下是不切实际的,即更新固件是相当繁重的。

因此需要一种自动识别代码版本的方法。在上述情况下,使用了 Git,开发人员定期将他们的工作提交到功能分支。显示 Git 提交哈希,以及是否存在未暂存的更改,将是识别用于编译固件的源代码状态的一种方法。

要求是我希望我的应用程序具有可用的信息,以便它能够显示: “Git 提交:[01abcdef...等],分支:experimentalStuffDoNotRelease”

因此,我想在编译的 C 和/或 C++ 代码中自动包含 Git 信息,例如提交哈希和分支。

开发环境有使用Windows和Linux的开发人员,并使用Eclipse CDT,工作流程相对简单:签出;编译;下载到硬件。


我使用 makefile,如下所示:

GIT_HASH=`git rev-parse HEAD`
COMPILE_TIME=`date -u +'%Y-%m-%d %H:%M:%S UTC'`
GIT_BRANCH=`git branch | grep "^\*" | sed 's/^..//'`
export VERSION_FLAGS=-DGIT_HASH="\"$(GIT_HASH)\"" -DCOMPILE_TIME="\"$(COMPILE_TIME)\"" -DGIT_BRANCH="\"$(GIT_BRANCH)\""

all:
    g++ main.cpp $(VERSION_FLAGS)

当 makefile 运行时,git 哈希值和编译时间都被加载到源代码中可访问的宏中,如下所示:

#include <iostream>

int main(){
  std::cerr<<"hash="<<GIT_HASH<<", time="<<COMPILE_TIME<<", branch="<<GIT_BRANCH<<std::endl; 
}

其输出如下:

hash=35f531bf1c959626e1b95f2d3e1a7d1e4c58e5ec, time=2017-05-18 04:17:25 UTC, branch=master
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C/C++ 源代码中包含 Git 提交哈希和/或分支名称 的相关文章

  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • Rx.NET 中是否有一个Subject 实现,其功能类似于BehaviourSubject,但仅在值发生更改时才发出?

    有没有Subject https learn microsoft com en us previous versions dotnet reactive extensions hh229699 v vs 103 Rx NET 中的实现在功能
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 如何防止克隆我的 github 存储库?

    我正在尝试找到一种方法来防止从 github 存储库克隆 例如 我有一个私有存储库 有些人在该存储库中工作 在公司计算机中 团队中的每个人都设置了授权级别 当我在 github 上为某个用户设置授权时 该存储库可在他 她自己的 github
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • Jenkins groovy - 如何从最新提交中检索标签?

    从中获取最新提交branchName 我们运行下面的代码 treeMapData git branch branchName credentialsId credential url gitLabServer projectName rep
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2

随机推荐

  • SQL Server 忽略 where 表达式中的大小写

    如何构造 where 子句不区分大小写的 SQL 查询 MS SQL Server SELECT FROM myTable WHERE myField sOmeVal 我希望结果返回时忽略此情况 在 SQL Server 数据库的默认配置中
  • 如何使用 JQuery 获取

    如何使用 Jquery 或 javascript 获取选择组件值 MyJSF 代码如下
  • 从 Windows 脚本发送邮件

    我想通过 Windows Server 2003 标准版上的脚本发送邮件 我认为服务器设置几乎是开箱即用的 邮件服务器是 Exchange 邮件服务器 当您位于内部网络时 您可以使用普通的旧式 SMTP 我已经在我的机器上使用 Perl 完
  • iPhone核心数据模拟器

    我创建了一个使用核心数据的应用程序 有没有办法在模拟器上查看sqlite db 也许有一个工具可以允许在模拟器上查询 sqlite 数据库 就像数据浏览器一样 有没有办法浏览 iPhone 模拟器到 sqlite 数据库位置 对于 Xcod
  • 无法读取未定义的属性“debugHosts”

    我在尝试将 Realm 与 RN 0 29 一起使用时收到此错误 来自 Chrome 的堆栈跟踪 Cannot read property debugHosts of undefined handleException Exceptions
  • 如何在 Grails 1.3.7 中记录 sql

    我尝试在数据源 测试环境 中使用 logSql true 配置 grails 中的 sql 日志 但测试输出中没有显示任何内容 我读了这篇文章 但它不起作用 如何在 Grails 中记录 SQL 语句 Thanks 我们在 Config g
  • 如何在 PostgresQL 中显示所有无效对象

    寻找视图我可以列出 PostgreSQL 中所有 无效 对象 在 Oracle 中 我们可以使用 dab objects status 列 但我不确定在 PostgreSQL 中是否有一种简单的方法可以做到这一点 也许 我可以用下面的代码检
  • 使用 python 将图像复制到 MacOS 剪贴板

    我想在 Mac OS 上将图像 PIL 图像 复制到剪贴板 我尝试了几十种不同的方法来做到这一点 大多数 python 剪贴板模块 如 pyclip 或 Clipboard 不支持图像 我找到了一个在 Windows 上执行此操作的代码 但
  • 无法解释的 C++ 默认 int 值

    我一直在重构一些代码 我注意到一些涉及未初始化 int 数组的奇怪行为 int arr ARRAY SIZE 我设置了一个断点 似乎所有值都默认为 858993460 这个值有什么特别的吗 有什么想法为什么它们不默认为 0 吗 858993
  • 根据序列中缺失的数字拆分列表

    我正在寻找最Pythonic的方法 根据序列中缺少的数字将数字列表拆分为更小的列表 例如 如果初始列表是 seq1 1 2 3 4 6 7 8 9 10 该函数将产生 1 2 3 4 6 7 8 9 10 or seq2 1 2 4 5 6
  • 如何在 UWP c# 中使用 DataTable 内容填充 DataGrid

    我正在创建一个 UWP 应用程序 并尝试使用包含数据库中数据的 DataTable 填充我的 DataGrid 但没有成功 我已经寻找解决方案 但无法摆脱该错误 XAML 代码
  • 如果 Visual Studio 2010 中属性窗口的描述框被隐藏,如何显示它?

    如果 Visual Studio 2010 中属性窗口的描述框被隐藏 如何显示它 例如 下图显示了描述框 它显示为 加载 每当用户加载表单时发生 我遇到了同样的问题 这是由于描述框长度被拖为零引起的 为了解决这个问题 我必须取消固定属性框并
  • 如何检查是否在 Cygwin、Mac 还是 Linux 中运行?

    我有一个可在 Windows Cygwin 以及 Mac 和 Linux 上使用的 shell 脚本 每个版本需要稍微不同的变量 shell bash 脚本如何检测它是在 Cygwin Mac 还是 Linux 中运行 通常 uname及其
  • 在 Intellij Idea 中找不到符号“var”

    每当我尝试从 Intellij Idea 运行我的应用程序时 我都会收到以下错误 如果我通过 Maven 构建应用程序 它就可以正常工作 看一下我的模块设置 JDK 是 v10 项目和模块的语言也是 v10 知道为什么会发生这种情况吗 我不
  • 如何有效地从字节中读取位?

    我正在开发一个包含 WebSockets 的项目 服务器 Node js 和客户端 Chrome 之间的数据是使用我设置的用于数据交换的自定义 非常简单 格式发送的 我以 3 位为单位发送数据 因为我发送的项目都有 8 种可能性 数据格式如
  • Hibernate - 批量更新从更新返回意外行数:0 实际行数:0 预期:1

    我收到以下休眠错误 我能够识别导致问题的功能 不幸的是 该函数中有多个数据库调用 由于休眠在事务结束时刷新会话 我无法找到导致问题的行 下面提到的休眠错误看起来像是一般错误 它甚至没有提到哪个 Bean 导致了这个问题 有人熟悉这个休眠错误
  • BarSpacing 选项在 Mathematica 中是如何实现的?

    我正在尝试实现一个DateListBarChart函数 获取日期数据并输出与以下位置相同的条形图DateListPlot 如果给定相同的数据 则它们必须在相同的水平位置绘制数据 这样就可以使用组合它们Show 我发现很难获取设置BarSpa
  • 修改twitter bootstrap导航栏

    我一直在尝试修改 Twitter 引导导航栏 目前所有链接都向左对齐 而我真正想要的是让它们居中 在另一篇文章中我读到你使用这个 tabs pills margin 0 auto padding 0 width 100px 但这对我不起作用
  • IRb:如何使用预加载的类启动交互式 ruby​​ 会话

    当我经历采用 Ruby 语言的旅程时 我花了很多时间在 IRb 上 太棒了 但是 由于我不太了解它的功能 并且对 Ruby 仍然是个 傻瓜 所以我想了解以下内容 如何在不重新启动 IRb 的情况下 刷新 会话 或者这是不可能的 如何配置 I
  • 在 C/C++ 源代码中包含 Git 提交哈希和/或分支名称

    我想知道如何将 Git 提交哈希和 或其他信息获取到已编译二进制文件中 C 变量的内容中 而不使其成为 Git 跟踪的源代码的一部分 我需要跟踪在嵌入式处理器上运行的已编译可执行文件中的固件版本信息 在这种封闭环境 即没有文件系统 中 无法