如何获取Git内部版本号并将其嵌入到文件中



我想引入一个从Git版本中获取的版本控制常量。我知道如何做到这一点——在svn中以一种非常粗鲁的方式——

关于如何使用Git做到这一点,有什么想法吗?

对我来说,git-descripte最初没有给出标签。然而,以下情况确实发生了:

git describe --all --long

这导致了一些由kubi描述的格式。假设你只想要最后一个部分(标签),如下所示(保存到version.txt文件):

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

EDIT:正如一位朋友向我指出的那样,如果你愿意,实际上可以只使用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(2017年第一季度)中进行了改进

参见Ramsay Jones提交的a765974(2016年12月4日)(``)
帮助者:Jeff King(peff
(由Junio C Hamano合并——gitster——于2016年12月19日提交0a45050)

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"来获得缩写的提交对象名称的绝对最小数目
这后来被更改为匹配bf50515的默认最小值7("Git 1.7.10.1",2012-05-01)。

如今,"默认最小值"会根据存储库的大小,并且指定特定的缩写长度;自Git 1.7.10.1以来我们想要的一切天是为了得到"我们默认使用的合理的东西"。

(这是在Git 2.11中介绍的:请参阅"一个Git-sha中有多少通常被认为是唯一识别给定代码库中的变化所必需的?"的最后一部分。)

只需从"git describe"的调用中删除"--abbrev=<number>"让命令选择它认为合适的最终用户的配置和存储库内容。

为了在php中获得Git修订版,我使用了这样的东西(将路径更改为.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

php版本如下:

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

然后像设置文件一样将该文件包含在脚本中。

如果愿意,也可以使用git describe --all --long作为版本字符串,出于我的目的,我更喜欢git-ref-parse --short HEAD中的git哈希。

或者作为一个可能更好的常数:

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

和版本.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";

生成BuildInfo.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"rnrn')
    f.write('const char BuildInfo::Name[] = "' + name + '";rn')
    f.write('const char BuildInfo::GitRevision[] = "' + revision + '";rn')
    f.close()

使用构建信息

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

为了生成BuildInfo.cpp,在构建后的步骤中,我调用(在本例中来自eclipse IDE)

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

最新更新