如何将git提交编号包含在c++可执行文件中

how to include git commit-number into a c++ executable?

本文关键字:c++ 可执行文件 包含 编号 git 提交      更新时间:2023-10-16

我使用git作为我的c++项目的版本跟踪器。

有时我需要重复计算,我想知道我使用了哪个版本的程序。

将提交的#放入主可执行文件的好方法是什么?换句话说。我希望程序在运行程序时,在介绍性消息中告诉我当前提交的#。

我能想到的一种方法是从shell中制作c++程序午餐"git log",并提取commit#,但我不确定在制作过程中如何做到这一点。

(我使用linux)

可能最简单的方法是在makefile中添加一个规则,以生成一个具有当前git commit ID:的.c文件

gitversion.c: .git/HEAD .git/index
    echo "const char *gitversion = "$(shell git rev-parse HEAD)";" > $@

现在,只需像往常一样将gitversion.c添加到构建过程中即可。请确保在make clean上删除它,并将它添加到.gitignore中,这样它就不会意外添加到git存储库中。将extern const char *gitversion;添加到某个标头中,您就可以这样访问它。

我在CMakeLists.txt中执行以下操作:

IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
  FIND_PACKAGE(Git)
  IF(GIT_FOUND)
    EXECUTE_PROCESS(
      COMMAND ${GIT_EXECUTABLE} rev-parse --short HEAD
      WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
      OUTPUT_VARIABLE "kml2maps_BUILD_VERSION"
      ERROR_QUIET
      OUTPUT_STRIP_TRAILING_WHITESPACE)
    MESSAGE( STATUS "Git version: ${kml2maps_BUILD_VERSION}" )
  ELSE(GIT_FOUND)
    SET(kml2maps_BUILD_VERSION 0)
  ENDIF(GIT_FOUND)
ENDIF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/kml2mapsVersion.h.in ${CMAKE_CURRENT_BINARY_DIR}/kml2mapsVersion.h @ONLY)

因此,git rev-parse --short HEAD的输出可以很好地构建在二进制文件中。

我使用git describe来获得一个使用标记或提交号的版本。如果分支的顶端在"v0.1"标记之上有额外的提交,那么这通常会给出不错的版本,比如:v0.1-1-g787c667

我使用的git命令是:git describe --tags --always。我通常将其与SCons构建系统一起使用,并将其定义为SConstruct:的常量、相关部分

import os, sys 
from subprocess import *
def getGitDesc():   
  return Popen('git describe --tags --always', stdout=PIPE, shell=True).stdout.read ().strip ()
GIT_DESC = getGitDesc () 
print "Building " + getGitDesc () + ".." 
env = Environment ()
# set up environment 
env.Append (CPPDEFINES = { 'GIT_DESC' : ('\"%s\"' % GIT_DESC) } )
# build your program
env.Program (....)

在C或C++程序中,我现在可以访问GIT_DESC作为字符串常量:

# include <iostream>
using namespace std;
int main (int argc, char ** argv) {
  cout << "Version: " << GIT_DESC << endl;
  return 42;
}

注意:git describe--abbrev=N参数可能有助于实现独立于用户git配置的一致版本输出。

如果您正在使用Qt,请将其放在项目的.pro文件中:

win32:DEFINES += GIT_BIN='C:\Git\bin\git'
# or 'C:\Progra~1\Git\bin\git' - ymmv with putting spaces in here
win32:DEFINES += GIT_REVISION='\"$$system($${GIT_BIN} rev-parse --short HEAD)\"'
unix:DEFINES += GIT_REVISION='\"$$system(git rev-parse --short HEAD)\"'

然后在代码中使用GIT_REVISION,就像在其他答案中一样——它的行为就像const char *

(感谢Alexander Barthel,我从他那里获得了这条消息。)