Как я могу получить номер сборки Git и вставить его в файл?
Я хочу представить константу управления версиями, взятую из версии в Git. Я знаю, как это сделать - очень хакерским способом в SVN -
какие-нибудь идеи о том, как сделать это с Git?
5 ответов
Для меня, git description изначально не давал хэштег. Следующее сделал, однако:
git describe --all --long
Это приводит к чему-то из описанного kubi формата. Предположим, вы хотите, чтобы только последняя часть (хэштег) выполнялась примерно так (сохранение в файл version.txt):
git describe --all --long | tr "-" " " | awk '{ print $3 }' > version.txt
РЕДАКТИРОВАТЬ: Как сказал мне друг, это может быть сделано с помощью только cut
вместо этого, если вы так желаете:
git describe --all --long | cut -d "-" -f 3 > version.txt
Вот что я делаю:
В рамках процесса сборки я запускаю следующий скрипт (перефразированный, так как сейчас я не в Xcode)
git describe --all > version.txt
Внутри моего приложения я считываю номер версии из этого файла и показываю его пользователю (при необходимости). Убедитесь, что вы добавили version.txt к вашему .gitignore. Преимущество этого заключается в том, что если вы пометите свои релизы git describe
просто выведет тег, в противном случае он выведет хеш коммита.
Примечание: интересно посмотреть, как сам Git вычисляет свой собственный номер сборки.
Это только что развилось в Git 2.12 (1 квартал 2017)
См. Коммит а765974 (04 декабря 2016 г.) Рамси Джонсом (``).
Помогает: Джефф Кинг ( peff
)
(Объединено Юнио С Хамано - 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
msgstr "чтобы получить абсолютное минимальное количество сокращённого имени объекта коммита.
Позже это было изменено, чтобы соответствовать минимуму по умолчанию 7 с bf50515 ("Git 1.7.10.1", 2012-05-01).В наши дни "минимум по умолчанию" автоматически масштабируется в зависимости от размера хранилища, и нет смысла указывать конкретную длину аббревиатуры; все, что мы хотели с Git 1.7.10.1 дней, это получить "что-то разумное, что мы будем использовать по умолчанию".
(Это было введено в Git 2.11: см. Последнюю часть " Сколько git-ша обычно считается необходимым для уникальной идентификации изменений в заданной кодовой базе? ")
Просто бросьте
--abbrev=<number>
"от вызова"git describe
"и позвольте команде выбрать то, что она считает подходящим, принимая во внимание конфигурацию конечного пользователя и содержимое хранилища.
Чтобы получить 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;
}
Вместо того, чтобы помещать его в текстовый файл, а затем получать его содержимое каждый раз, это, кажется, работает довольно хорошо:
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');
Вот как я это сделал. Примечание: код 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, на этапе пост-сборки я вызываю (в данном случае из Eclipse IDE)
python ${ProjDirPath}/build/GenerateBuildInfo.py ${ProjDirPath}/src/BuildInfo.cpp ${ProjName}