Как определить состояние репозитория git во время компиляции? - PullRequest
3 голосов
/ 09 февраля 2012

Я работаю над системой моделирования, написанной на C ++, которая управляется git. Я использую GNU make как инструмент для сборки. Создание воспроизводимых результатов моделирования очень полезно, поскольку вы можете вернуться к точной версии программы моделирования, с которой были созданы результаты.

В настоящее время состояние и SHA1 репозитория git определяются программно в время выполнения и записываются в файл вместе с результатами. Однако, если исходные данные были изменены с момента компиляции программы, статус в моем файле журнала не будет отражать фактическую версию программы. Таким образом, я ищу способ определить состояние git на время компиляции . Есть ли шанс сделать это?

Ответы [ 2 ]

4 голосов
/ 09 февраля 2012

Одним из решений является то, что ваша система сборки извлечет значение и сгенерирует некоторый заголовок C ++ (или исходный файл) с этим значением внутри него.

Например, если вы используете CMake, вы можете использовать модуль FindGit , чтобы сделать что-то вроде:

project(...)

# load module.
find_package(Git)

# create "${GIT_HEAD_HASH}" variable that contains
# the SHA-1 of the current tree.  This assumes that the
# root CMakeLists is in the root of the Git repository.
git_tree_info(${CMAKE_SOURCE_DIR} GIT_HEAD)

# generate a 'version.h' file based on the 'version.h.in'
# file.  replace all @...@ strings with variables in the
# current scope.
configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/version.h.in
    ${CMAKE_CURRENT_SOURCE_DIR}/version.h
    @ONLY
)

Затем добавьте следующий version.h.in файл:

#ifndef _version_h__
#define _version_h__

static const char VERSION[] = "@GIT_HEAD_HASH@";

#endif

CMake заменит строку @GIT_HEAD_HASH@ на значение, извлеченное с помощью get_tree_info().

Тогда из вашего обычного кода:

#include "version.h"
#include <cstdlib>
#include <cstring>
#include <iostream>

int main(int argc, char ** argv)
{
    if ((argc == 2) && (std::strcmp(argv[1],"--version") == 0))
    {
        std::cerr
            << VERSION
            << std::endl;
        return (EXIT_FAILURE);
    }

    // ...
}

Это упрощенный и абсолютно непроверенный пример. Если вы посмотрите на источники модуля FindGit CMake, вы увидите, что он просто запускает команду execute_process() во время сборки для извлечения информации. Вы можете изменить его, чтобы извлечь что-либо на основе вызова интерфейса командной строки Git.

1 голос
/ 09 февраля 2012

Поскольку вы уже используете Makefile, вы можете проверить статус там.

Если вы хотите отслеживать, какой коммит был HEAD в то время, вы можете использовать git rev-parse HEADполучить sha1 коммита.Вы можете сохранить его в файле, если вам это нужно во время выполнения.

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