我使用git作为我的c ++项目的版本跟踪器。
有时我需要重复计算,我想知道我使用的程序版本。
将提交的#放入主可执行文件的好方法是什么?换一种说法。我希望程序在运行程序时告诉我介绍性消息中当前提交的#。
我能想到的一种方法是让shell中的c ++程序午餐“git log”并提取提交#但我不确定如何在make期间执行此操作。
(我使用linux)
答案 0 :(得分:31)
最简单的方法可能是在makefile中添加一条规则来生成一个带有当前git提交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;
标题,您可以像这样访问它。
答案 1 :(得分: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)
所以git rev-parse --short HEAD
的输出很适合在二进制文件中构建。
答案 2 :(得分:14)
我使用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;
}
注意:--abbrev=N
的{{1}}参数可能对实现独立于用户git配置的一致版本输出很有用。
答案 3 :(得分:2)
如果您使用的是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,我从中掠夺了此技巧。)