如何将git commit-number包含到c ++可执行文件中?

kir*_*gum 40 c++ git makefile

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

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

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

我能想到的一种方法是让shell中的c ++程序午餐"git log"并提取commit#但是我不确定如何在make期间执行它.

(我使用linux)

bdo*_*lan 34

可能最简单的方法是在makefile中添加一条规则来生成一个带有当前git提交ID的.c文件:

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

现在只需gitversion.c正常添加到您的构建过程.确保将其删除make clean,并将其添加到其中,.gitignore以免意外地将其添加到git存储库中.extern const char *gitversion;在某处添加标题,您可以像这样访问它.

  • `gitversion.c:`之后列出的文件是它所依赖的文件.`.git`是一个隐藏目录; `HEAD`是一个文件.因此,当`.git/HEAD`或`.git/index`发生变化时,`gitversion.c:`将使用下一行的命令重建. (6认同)

Nas*_*zta 16

我在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)
Run Code Online (Sandbox Code Playgroud)

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

  • 此方法假定您为每个提交手动运行cmake. (4认同)

gau*_*teh 14

git describe用来获得一个使用标签或提交号码的版本.这通常会给出很好的版本:v0.1-1-g787c667如果分支的提示在'v0.1'标记之上有额外的提交.

我使用的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 (....)
Run Code Online (Sandbox Code Playgroud)

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

# include <iostream>

using namespace std;

int main (int argc, char ** argv) {
  cout << "Version: " << GIT_DESC << endl;
  return 42;
}
Run Code Online (Sandbox Code Playgroud)

注意:--abbrev=N参数git describe可能对于实现与用户git配置无关的一致版本输出很有用.


Jac*_*eth 5

如果您使用 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)\\"'
Run Code Online (Sandbox Code Playgroud)

然后GIT_REVISION像在其他答案中一样在您的代码中使用 - 它的行为与const char *.

(感谢 Alexander Barthel,我从他那里掠夺了这个小费。)