如何利用git 号作为版本号 c++
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用git 号作为版本号 c++相关的知识,希望对你有一定的参考价值。
首先在本地建立一个文件夹命名为manager.然后打开终端,输入cd ,把文件夹拖到cd后面,回车,输入pwd之后再回车,进入到manager文件夹下,然后开始git指令,第一步git init,在本地建立一个空仓库。之后建立一个文件名为mian.c的文件,touch main.c。在mian.c中手动输入一些文字,然后输入git status查看状态。
main.c为红色说明main.c被编辑过了,现在继续编辑准备提交输入int b = 2.现在的main.c是存在工作区的,下一步是要把修改的文件添加到暂存区,git add main.c,不过~回车之后并没有什么变化,继续操作,是把暂存区里的main.c添加到本地仓库中,git
commit main.c
-m添加了b,如果不添加-m的话会少一个配置,会进入到一个vim模式(不可编辑),并且提示你添加一个文件,这时候需要先输入i,下面会出现一个insert,然后编辑你提交的信息,然后按esc键,在按:wq,保存并退出。所以为了不要这么麻烦,直接在后面加上-m和注释就可以了
这样说明已经把修改的内容成功提交到本地仓库了!
下一步,如果想回到某个版本怎么办看首先git log,看一下日志信息,或者git reflog.
git log下可以看到一个40位的哈希值,这里你可以把它当做序列号就好了,也就是你的版本号。而在git reflog下,只显示你版本号的前7位,其实用的时候就用这前7位就够了。如果想回到某个版本,只需要git reset --hard 版本号就可以了在打开你的main.c你会发现他回到了你需要的地方.还有一个指令可以看到你修改的地方:首先编辑你的main.c,然后输入git diff mian.c,你会看到效果的.
好了,git建立本地仓库就到这里,还有很多命令没介绍到,以后用的时候还要多多练习! 参考技术A tim_cnt_temp = tim_cnt; tim_cnt = tim_cnt + (2*tim_cnt+tim_rest) / (4*(step_dec-i)-1); tim_rest = (2*tim_cnt_temp+tim_rest) % (4*(step_dec-i)-1); run_state = run_state_stop; TIM_Cmd(TIM3,DISABLE); void TIM2_IRQHandler(void)
如何获取 Git 内部版本号并将其嵌入文件中?
【中文标题】如何获取 Git 内部版本号并将其嵌入文件中?【英文标题】:How can I get the Git build number and embed it in a file? 【发布时间】:2011-09-21 11:31:51 【问题描述】:我想介绍一个从 Git 版本中获取的版本控制常量。我知道如何做到这一点——在 svn 中以一种非常骇人听闻的方式——
关于如何使用 Git 执行此操作的任何想法?
【问题讨论】:
你想把它嵌入到像$Id$
这样的文件中吗?这真的行不通。不过,如果您只想完整地描述构建,git describe
是的,我确实想做类似的事情,甚至可能写一个我可以解析的文件 version.log
类似于 $ID$ -- 抱歉。我需要在我的 php 代码中重用该内部版本号
Git 不是首字母缩写词。它只是“Git”,而不是“GIT”。
【参考方案1】:
这是我的工作:
作为构建过程的一部分,我运行以下脚本(解释一下,因为我现在不在 Xcode)
git describe --all > version.txt
在我的应用程序中,我从该文件中读取版本号并将其显示给用户(必要时)。确保将 version.txt 添加到您的 .gitignore。这样做的好处是,如果你标记你的发布,git describe
只会输出标记,否则它会输出提交哈希。
【讨论】:
对我来说,这给了我分支名称而不是版本# 它会给你g
。
对我来说是 git describe(没有 --all)(我使用的是 1.9.5.msysgit.0)【参考方案2】:
对我来说,git describe 最初并没有给出主题标签。但是,以下是:
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
【讨论】:
这实际上更接近我想要的。现在我只需要找到一种方法将其嵌入文件中。我想在代码中引用构建 ID 这似乎是一个不同的问题,但绝对有可能。在 PHP 中:$git_version = file_get_contents("version.txt");
- 现在 $git_version
包含哈希 :)【参考方案3】:
为了在 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;
【讨论】:
【参考方案4】:与其把它放在一个文本文件中然后每次都获取它的内容,这似乎工作得很好:
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-ref-parse --short HEAD
中的 git-hash。
或者作为一个可能更好的常数:
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');
【讨论】:
【参考方案5】:注意:看看 Git 自己如何计算自己的内部版本号很有趣。 这刚刚在 Git 2.12(2017 年第一季度)中发展
见commit a765974(2016 年 12 月 4 日)Ramsay Jones (``)。
帮助者:Jeff King (peff
).(由 Junio C Hamano -- gitster
-- 合并于 commit 0a45050,2016 年 12 月 19 日)
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
: usegit-describe
to mark the git version.", 2005-12-27),我们用“--abbrev=4
”来获取 缩写提交对象名称的绝对最小数量。 后来更改为将默认最小值 7 与 bf50515 ("Git 1.7.10.1", 2012-05-01) 匹配。如今,“默认最小值”会自动缩放,具体取决于 存储库的大小,指定一个没有意义 特定的缩写长度;自 Git 1.7.10.1 以来我们想要的一切 days 是为了得到“我们默认使用的合理的东西”。
(这是在 Git 2.11 中引入的:参见“How much of a git sha is generally considered necessary to uniquely identify a change in a given codebase?”的最后部分)
只需从“
git describe
”的调用中删除“--abbrev=<number>
” 并让命令选择它认为合适的,采取 考虑最终用户的配置和存储库内容。
【讨论】:
【参考方案6】:我就是这样做的。注意:获取修订的 Python 代码来自this 帖子。
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。用于生成 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()
使用构建信息
#include "BuildInfo.hpp"
...
PrintRevision(BuildInfo::GitRevision);
要生成 BuildInfo.cpp,在我调用的后期构建步骤中(在本例中来自 eclipse IDE)
python $ProjDirPath/build/GenerateBuildInfo.py $ProjDirPath/src/BuildInfo.cpp $ProjName
【讨论】:
以上是关于如何利用git 号作为版本号 c++的主要内容,如果未能解决你的问题,请参考以下文章