Как включить git commit-number в исполняемый файл c ++? - PullRequest
38 голосов
/ 29 июня 2011

Я использую Git в качестве трекера версий для моего проекта C ++.

иногда мне нужно повторить расчет, и я хотел бы знать, какую версию программы я использовал.

Что было бы хорошим способом поместить # коммита в основной исполняемый файл? другими словами. Я хотел бы, чтобы программа сообщала мне # текущего коммита во вводном сообщении при запуске программы.

Один из способов, который я могу придумать, - сделать ланч программы на c ++ "git log" из оболочки и извлечь коммит #, но я не уверен, как это сделать во время make.

(я использую Linux)

Ответы [ 4 ]

33 голосов
/ 29 июня 2011

Вероятно, самый простой способ сделать это - добавить в ваш make-файл правило для генерации файла .c с текущим идентификатором git commit:

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; к заголовку, и вы сможете получить к нему доступ таким образом.

16 голосов
/ 30 июня 2011

Я делаю следующее в 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 хорош для сборки в двоичном файле.

14 голосов
/ 06 февраля 2014

Я использую 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 (....)

В программе на C или C ++ теперь я могу получить доступ к GIT_DESC в виде строковой константы:

# include <iostream>

using namespace std;

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

примечание: аргумент --abbrev=N для git describe может быть полезен для получения согласованного вывода версии независимо от конфигурации git пользователя.

3 голосов
/ 13 сентября 2018

Если вы используете 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 *.

(Спасибо Александру Бартелю, от которого я ограбил этот совет.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...