Как я могу получить номер сборки Git и вставить его в файл? - PullRequest
12 голосов
/ 23 июня 2011

Я хочу представить константу управления версиями, взятую из версии в Git. Я знаю, как это сделать - очень хакерским способом в SVN -

есть идеи, как это сделать с помощью Git?

Ответы [ 6 ]

7 голосов
/ 20 декабря 2011

Для меня git description изначально не давал хэштег. Следующее сделало, однако:

git describe --all --long

В результате получается формат, описанный Куби. Предположим, вы хотите, чтобы только последняя часть (хэштег) выполнялась примерно так (сохранение в файл version.txt):

git describe --all --long | tr "-" " " | awk '{ print $3 }' > version.txt

РЕДАКТИРОВАТЬ : Как указал мне друг, на самом деле это можно сделать, используя вместо этого cut, если вы этого хотите:

git describe --all --long | cut -d "-" -f 3 > version.txt
7 голосов
/ 23 июня 2011

Вот что я делаю:

В рамках процесса сборки я запускаю следующий скрипт (перефразированный, поскольку сейчас я не в Xcode)

git describe --all > version.txt

Внутри моего приложения я прочитал номер версии из этого файла и отобразил его пользователю (при необходимости). Убедитесь, что вы добавили version.txt в .gitignore . Преимущество такого способа состоит в том, что если вы пометите свои выпуски, git describe просто выведет тег, в противном случае он выведет хеш коммита.

3 голосов
/ 24 декабря 2016

Примечание: интересно посмотреть, как сам Git вычисляет свой собственный номер сборки.
Это только что развилось в Git 2.12 (1-й квартал 2017 года)

См. коммит a765974 (04 декабря 2016) Рамсей Джонс (``) .
Помощник: Джефф Кинг (peff) .
(Объединено Junio ​​C Hamano - gitster - в коммит 0a45050 , 19 декабря 2016 г.)

GIT-VERSION-GEN 

VN=$(git describe --match "v[0-9]*" HEAD 2>/dev/null) 
# instead of
VN=$(git describe --match "v[0-9]*" --abbrev=7 HEAD 2>/dev/null)

GIT-VERSION-GEN: не применять длину аббревиатуры, используемую 'describe'

Имя версии по умолчанию для двоичного файла Git вычисляется путем выполнения «git describe» для коммита, из которого сделан двоичный файл, на основе тега, имя которого совпадает с «v[0-9]*», например, v2.11.0-rc2-2-g7f1dc9.

В самые первые дни, с 9b88fce ("Makefile: используйте git-describe чтобы пометить версию git. ", 2005-12-27) , мы использовали" --abbrev=4 ", чтобы получить Абсолютное минимальное количество сокращенных имен объектов фиксации.
Позже это было изменено, чтобы соответствовать минимуму по умолчанию 7 с bf50515 ("Git 1.7.10.1", 2012-05-01) .

В наши дни «минимум по умолчанию» автоматически масштабируется в зависимости от размер репозитория , и нет смысла указывать конкретная длина аббревиатуры; все что мы хотели с Git 1.7.10.1 дни должны были получить «что-то разумное, что мы будем использовать по умолчанию».

(Это было введено в Git 2.11: см. Последнюю часть « Сколько из git sha обычно считается необходимым для однозначной идентификации изменения в заданной кодовой базе? » )

Просто удалите "--abbrev=<number>" из вызова "git describe" и пусть команда выберет то, что считает нужным, взяв Конфигурация конечного пользователя и содержимое репозитория в учетную запись.

3 голосов
/ 03 октября 2014

Чтобы получить Git-ревизию в php, я использую что-то вроде этого (измените ваш путь на .Git каталог)

public static function getGitRevision()
     {
         $rev = trim(file_get_contents(NT_Path::ROOT . "/.git/HEAD"));

         if (substr($rev, 0, 4) == 'ref:') {
             $ref =  end(explode('/', $rev));
             $rev = trim(file_get_contents(NT_Path::ROOT . "/.git/refs/heads/{$ref}"));
         }

         return $rev;
     }
0 голосов
/ 13 июня 2019

Вот как я это сделал. Примечание: Python-код для получения ревизии взят из этой записи.

BuildInfo.hpp

#ifndef BUILDINFO_HPP_
#define BUILDINFO_HPP_

struct BuildInfo
{
    static const char Name[];
    static const char GitRevision[];
};

#endif

(Сгенерировано автоматически) BuildInfo.cpp

#include "BuildInfo.hpp"

const char BuildInfo::Name[] = "MyAppNAme";
const char BuildInfo::GitRevision[] = "5e854351b342acff6a3481d9106076df379c449a";

GenerateBuildInfo.py. Скрипт Python для генерации BuildInfo.cpp. Обратите внимание, что это может быть легко адаптировано для получения коротких или длинных номеров ревизий или другой информации о хранилище. Он также может быть преобразован для генерации кода C, а не cpp, поэтому совместим с обоими.

import sys
import os
import subprocess

#args: [0]: this script path [1]: Output file name [2]: Application name string

# Return the git revision as a string
def git_version():
    def _minimal_ext_cmd(cmd):
        # construct minimal environment
        env = {}
        for k in ['SYSTEMROOT', 'PATH']:
            v = os.environ.get(k)
            if v is not None:
                env[k] = v
        # LANGUAGE is used on win32
        env['LANGUAGE'] = 'C'
        env['LANG'] = 'C'
        env['LC_ALL'] = 'C'
        out = subprocess.Popen(cmd, stdout = subprocess.PIPE, env=env).communicate()[0]
        return out

    try:
        out = _minimal_ext_cmd(['git', 'rev-parse', 'HEAD'])
        GIT_REVISION = out.strip().decode('ascii')
    except OSError:
        GIT_REVISION = "Unknown"

    return GIT_REVISION

if len(sys.argv) < 2 :
    exit("No output file name argument provided")
elif len(sys.argv) >= 3 :
    name = sys.argv[2]
else :
    name = ""

revision = git_version()
if (revision == "Unknown") :
    exit("Cant get git revision")

with open(sys.argv[1], "w") as f :
    f.write('#include "BuildInfo.hpp"\r\n\r\n')
    f.write('const char BuildInfo::Name[] = "' + name + '";\r\n')
    f.write('const char BuildInfo::GitRevision[] = "' + revision + '";\r\n')
    f.close()

Для использования информации о сборке

#include "BuildInfo.hpp"
...
PrintRevision(BuildInfo::GitRevision);

Чтобы сгенерировать BuildInfo.cpp, на этапе посткомпиляции я вызываю (в данном случае из IDE затмения)

python ${ProjDirPath}/build/GenerateBuildInfo.py ${ProjDirPath}/src/BuildInfo.cpp ${ProjName}
0 голосов
/ 29 июля 2015

Вместо того, чтобы помещать его в текстовый файл, а затем получать его содержимое каждый раз, это, кажется, работает довольно хорошо:

sed -i.bak "s/$version = '.*';/$version = '`git rev-parse --short HEAD | tr -d '\n'`';/g" version.php

где version.php выглядит так:

<?php
$version = 'some version string';

и затем просто включите файл в ваш скрипт, как если бы вы были файлом настроек.

Вы также можете использовать git describe --all --long в качестве строки версии, если хотите, я предпочел git-хеш из git-ref-parse --short HEAD для моих целей.

Или как константа, которая может быть лучше:

sed -i.bak "s/define('VERSION','.*');/define('VERSION','`git describe --all --long | cut -d "-" -f 3`');/g" version.php

и version.php:

<?php
define('VERSION','some version string');
...