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

如何获取Git版本号并将其嵌入到文件中?,git,version,embed,Git,Version,Embed,我想引入一个从Git版本中获取的版本控制常量。我知道如何做到这一点——在svn中以一种非常黑客的方式-- 关于如何使用Git实现这一点,有什么想法吗?以下是我的工作: 作为构建过程的一部分,我运行以下脚本(解释如下,因为我现在不在Xcode) 在我的应用程序中,我从这个文件中读取版本号,并将其显示给用户(必要时)。确保将version.txt添加到.gitignore。这样做的好处是,如果您标记您的发行版,git descripe将只输出标记,否则它将输出提交散列。对于我来说,git descr

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

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

以下是我的工作:

作为构建过程的一部分,我运行以下脚本(解释如下,因为我现在不在Xcode)


在我的应用程序中,我从这个文件中读取版本号,并将其显示给用户(必要时)。确保将version.txt添加到.gitignore。这样做的好处是,如果您标记您的发行版,git descripe将只输出标记,否则它将输出提交散列。

对于我来说,git descripe最初没有给出散列标记。然而,以下情况确实发生了:

git describe --all --long
这导致了库比所描述的某种格式。假设您只需要最后一部分(hashtag),如下所示(保存到version.txt文件):

编辑:正如一位朋友向我指出的那样,如果您愿意,实际上可以使用
剪切
来完成:

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

为了在php中获得Git修订版,我使用类似的方法(将路径更改为.Git目录)


与每次都将其放入文本文件然后获取其内容不同,这似乎工作得相当好:

sed -i.bak "s/$version = '.*';/$version = '`git rev-parse --short HEAD | tr -d '\n'`';/g" version.php
其中version.php如下所示:

<?php
$version = 'some version string';
和version.php:

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

注意:看看Git本身如何计算自己的版本号很有趣。
这在Git 2.12(2017年第一季度)中有所发展

参见(2016年12月4日)作者。
帮助人:。
(于2016年12月19日被合并)

GIT-VERSION-GEN
:不要强制“
descripe
”使用缩写长度 Git二进制文件的默认版本名是根据名称与“
v[0-9]*
”匹配的标记(例如
v2.11.0-rc2-2-g7f1dc9
)在提交二进制文件时运行“
Git description
”来计算的

在早期,我们使用“
--abbrev=4
”获得 缩写提交对象名称的绝对最小数目。
后来将其更改为与默认最小值7匹配

这些天,“默认最小值”会根据不同情况自动调整 存储库的大小,没有必要指定 特定缩写长度;自Git 1.7.10.1以来我们想要的一切 天是为了得到“一些我们默认使用的合理的东西”

(这是在Git 2.11中介绍的:请参阅“”的最后一部分)

只需从“
git descripe
”的调用中删除“
--abbrev=
” 并让命令选择它认为合适的,采取 考虑最终用户的配置和存储库内容


我就是这样做的。注意:获取修订版的Python代码来自post

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。用于生成BuildInfo.cpp的Python脚本。请注意,这可以很容易地进行调整,以获取短或长版本号或其他存储库信息。它也可以转换为生成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()
要生成BuildInfo.cpp,在构建后步骤中,我调用(在本例中是从EclipseIDE调用)


是否要将其嵌入到类似
$Id$
的文件中?那真的不管用。如果您只想完整地描述一个构建,
git descripe
是的,我确实想做一些类似的事情,或者甚至可能编写一个类似于$ID$的文件version.log--对不起。我需要在我的php代码中重复使用这个构建号,Git不是首字母缩略词。它只是“Git”,而不是“Git”。对我来说,这给了我分支名称,但不是版本#它会给你--@kubi No。它是前缀为
g
的7位哈希。对我来说,它是Git descripe(没有--all)(我使用的是1.9.5.msysgit.0),这实际上更接近我想要的。现在我只需要找到一种方法将它嵌入到一个文件中。我想在代码中引用构建id。这似乎是一个不同的问题,但这是完全可能的。在PHP中:
$git_version=file_get_contents(“version.txt”)-现在
$git\u version
包含哈希:)
<?php
define('VERSION','some version string');
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)
#ifndef BUILDINFO_HPP_
#define BUILDINFO_HPP_

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

#endif
#include "BuildInfo.hpp"

const char BuildInfo::Name[] = "MyAppNAme";
const char BuildInfo::GitRevision[] = "5e854351b342acff6a3481d9106076df379c449a";
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);
python ${ProjDirPath}/build/GenerateBuildInfo.py ${ProjDirPath}/src/BuildInfo.cpp ${ProjName}