Как я могу получить номер сборки Git и вставить его в файл?

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

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

Ответ 1

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

git describe --all --long

Это приводит к чему-то описанному форматом kubi. Предположим, вам нужна только последняя часть (hashtag), которая будет выглядеть следующим образом (сохранение в файл version.txt):

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

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

git describe --all --long | cut -d "-" -f 3 > version.txt

Ответ 2

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

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

git describe --all > version.txt

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

Ответ 3

Чтобы получить версию 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;
     }

Ответ 4

Примечание. Интересно посмотреть, как сам Git вычисляет свой собственный номер сборки.
Это только что развивалось в Git 2.12 (Q1 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" в commit, из которого сделан двоичный код, на основе тега, имя которого соответствует "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" и пусть команда выбирает то, что, по ее мнению, уместно, принимая конфигурации конечного пользователя и содержимого репозитория.

Ответ 5

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

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

где version.php выглядит следующим образом:

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

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

Вы также можете использовать git describe --all --long в качестве своей строки версии, если хотите, я предпочел git -hash из 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');

Ответ 6

Вот как я это сделал. Примечание: код 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 eclipse)

python ${ProjDirPath}/build/GenerateBuildInfo.py ${ProjDirPath}/src/BuildInfo.cpp ${ProjName}