如何让我的C代码自动打印出它的Git版本哈希?
有没有一种简单的方法来编写可以访问其Git版本哈希的C代码 我用C语言编写软件,在实验室环境中收集科学数据。我的代码将收集的数据记录在一个.yaml文件中,以供以后分析。我的实验每天都在变化,我经常不得不修改代码。为了跟踪修订,我使用git存储库如何让我的C代码自动打印出它的Git版本哈希?,c,git,version-control,workflow,C,Git,Version Control,Workflow,有没有一种简单的方法来编写可以访问其Git版本哈希的C代码 我用C语言编写软件,在实验室环境中收集科学数据。我的代码将收集的数据记录在一个.yaml文件中,以供以后分析。我的实验每天都在变化,我经常不得不修改代码。为了跟踪修订,我使用git存储库 我希望能够在我的.yaml数据文件中包含Git修订哈希作为注释。这样,我就可以查看.yaml文件并确切地知道使用什么代码生成该文件中显示的数据。有没有一种简单的方法可以自动执行此操作 您的程序可以在运行时或作为构建过程的一部分,使用git Descri
我希望能够在我的.yaml数据文件中包含Git修订哈希作为注释。这样,我就可以查看.yaml文件并确切地知道使用什么代码生成该文件中显示的数据。有没有一种简单的方法可以自动执行此操作 您的程序可以在运行时或作为构建过程的一部分,使用git Descripte来实现。您需要做的是生成一个头文件(例如使用来自cmd行的echo),如下所示:
#define GIT_HASH \
"098709a0b098c098d0e"
echo #define GIT_HASH \ > file.h
echo " > file.h
echo git status <whatever cmd to get the hash> > file.h
echo " > file.h
#include "version.h"
const char * build_date = "2009-11-10 11:09";
const char * build_git_sha = "6b54ea36e92d4907aba8b3fade7f2d58a921b6cd";
#ifndef VERSION_H
#define VERSION_H
extern const char * build_date; /* 2009-11-10 11:09 */
extern const char * build_git_sha; /* 6b54ea36e92d4907aba8b3fade7f2d58a921b6cd */
#endif /* VERSION_H */
/* version.c */
#include "version.h"
const char * build_git_sha = "ac5bffc90f0034df9e091a7b3aa12d150df26a0e";
const char * build_git_time = "Thu Dec 3 18:03:58 EST 2009";
/*version.h*/
#ifndef VERSION_H_
#define VERSION_H_
extern const char * build_git_time;
extern const char * build_git_sha;
#endif /* VERSION_H_ */
要生成它,请使用以下内容:
#define GIT_HASH \
"098709a0b098c098d0e"
echo #define GIT_HASH \ > file.h
echo " > file.h
echo git status <whatever cmd to get the hash> > file.h
echo " > file.h
#include "version.h"
const char * build_date = "2009-11-10 11:09";
const char * build_git_sha = "6b54ea36e92d4907aba8b3fade7f2d58a921b6cd";
#ifndef VERSION_H
#define VERSION_H
extern const char * build_date; /* 2009-11-10 11:09 */
extern const char * build_git_sha; /* 6b54ea36e92d4907aba8b3fade7f2d58a921b6cd */
#endif /* VERSION_H */
/* version.c */
#include "version.h"
const char * build_git_sha = "ac5bffc90f0034df9e091a7b3aa12d150df26a0e";
const char * build_git_time = "Thu Dec 3 18:03:58 EST 2009";
/*version.h*/
#ifndef VERSION_H_
#define VERSION_H_
extern const char * build_git_time;
extern const char * build_git_sha;
#endif /* VERSION_H_ */
echo\define GIT\u HASH\>file.h
echo“>文件.h
echo git status>file.h
echo“>文件.h
可能需要使用引号和反斜杠来编译,但你明白了。当我需要这样做时,我会使用一个,比如
RELEASE\u 1\u 23
。我可以在不知道SHA-1的情况下决定标签是什么。我承诺然后标记。你可以在你的程序中以你喜欢的任何方式存储该标记。你可以看到我是如何在memcached中实现它的
基本上,偶尔标记,并确保您交付的内容来自
make dist
或类似文件。在我的程序中,我将git版本号和构建日期保存在一个名为version.c
的单独文件中,该文件如下所示:
#define GIT_HASH \
"098709a0b098c098d0e"
echo #define GIT_HASH \ > file.h
echo " > file.h
echo git status <whatever cmd to get the hash> > file.h
echo " > file.h
#include "version.h"
const char * build_date = "2009-11-10 11:09";
const char * build_git_sha = "6b54ea36e92d4907aba8b3fade7f2d58a921b6cd";
#ifndef VERSION_H
#define VERSION_H
extern const char * build_date; /* 2009-11-10 11:09 */
extern const char * build_git_sha; /* 6b54ea36e92d4907aba8b3fade7f2d58a921b6cd */
#endif /* VERSION_H */
/* version.c */
#include "version.h"
const char * build_git_sha = "ac5bffc90f0034df9e091a7b3aa12d150df26a0e";
const char * build_git_time = "Thu Dec 3 18:03:58 EST 2009";
/*version.h*/
#ifndef VERSION_H_
#define VERSION_H_
extern const char * build_git_time;
extern const char * build_git_sha;
#endif /* VERSION_H_ */
还有一个头文件,如下所示:
#define GIT_HASH \
"098709a0b098c098d0e"
echo #define GIT_HASH \ > file.h
echo " > file.h
echo git status <whatever cmd to get the hash> > file.h
echo " > file.h
#include "version.h"
const char * build_date = "2009-11-10 11:09";
const char * build_git_sha = "6b54ea36e92d4907aba8b3fade7f2d58a921b6cd";
#ifndef VERSION_H
#define VERSION_H
extern const char * build_date; /* 2009-11-10 11:09 */
extern const char * build_git_sha; /* 6b54ea36e92d4907aba8b3fade7f2d58a921b6cd */
#endif /* VERSION_H */
/* version.c */
#include "version.h"
const char * build_git_sha = "ac5bffc90f0034df9e091a7b3aa12d150df26a0e";
const char * build_git_time = "Thu Dec 3 18:03:58 EST 2009";
/*version.h*/
#ifndef VERSION_H_
#define VERSION_H_
extern const char * build_git_time;
extern const char * build_git_sha;
#endif /* VERSION_H_ */
头文件和C文件都由Perl脚本生成,如下所示:
#define GIT_HASH \
"098709a0b098c098d0e"
echo #define GIT_HASH \ > file.h
echo " > file.h
echo git status <whatever cmd to get the hash> > file.h
echo " > file.h
#include "version.h"
const char * build_date = "2009-11-10 11:09";
const char * build_git_sha = "6b54ea36e92d4907aba8b3fade7f2d58a921b6cd";
#ifndef VERSION_H
#define VERSION_H
extern const char * build_date; /* 2009-11-10 11:09 */
extern const char * build_git_sha; /* 6b54ea36e92d4907aba8b3fade7f2d58a921b6cd */
#endif /* VERSION_H */
/* version.c */
#include "version.h"
const char * build_git_sha = "ac5bffc90f0034df9e091a7b3aa12d150df26a0e";
const char * build_git_time = "Thu Dec 3 18:03:58 EST 2009";
/*version.h*/
#ifndef VERSION_H_
#define VERSION_H_
extern const char * build_git_time;
extern const char * build_git_sha;
#endif /* VERSION_H_ */
my$git_sha=`git rev parse HEAD`;
$git_sha=~s/\s+//g;
#它包含所有构建变量。
我的%build;
$build{date}=make_date_time();
$build{git_sha}=$git_sha;
散列到c文件(“version.c”,\%build,“build”);
在这里,hash_to_c_file
完成了创建version.c
和version.h
和make_date\u time
生成一个字符串的所有工作,如图所示
在主程序中,我有一个例程
#include "version.h"
// The name of this program.
const char * program_name = "magikruiser";
// The version of this program.
const char * version = "0.010";
/* Print an ID stamp for the program. */
static void _program_id_stamp (FILE * output)
{
fprintf (output, "%s / %s / %s / %s\n",
program_name, version,
build_date, build_git_sha);
}
我对git不是很了解,所以如果有更好的方法,我欢迎大家发表意见。您可以做两件事:
- 您可以使用Git在文件中嵌入一些版本信息
更简单的方法是使用
,这意味着放置(例如) 在ident
文件中,并将.gittributes
放在适当的位置。它将自动扩展为文件内容的SHA-1标识符(blob id):这不是文件版本,也不是上次提交 Git确实以这种方式支持$Id$关键字,以避免接触在分支切换、倒带分支等过程中未更改的文件。如果您确实希望Git在文件中放置提交(版本)标识符或描述,您可以(ab)使用$Id$
属性,使用clean/smude过滤器扩展某些关键字(例如$Revision$)签出时,并清理它以进行提交过滤器
- 您可以像Linux内核或Git本身一样,使用构建过程来为您实现这一点
看看脚本及其在Git中的使用,或者举例来说,这个Makefile如何在生成/配置
文件期间嵌入版本信息 GIT-VERSION-GEN使用GIT description生成版本描述。您需要更好地标记(使用签名/注释标记)项目的发布/里程碑gitweb/gitweb.cgi
$(MyLibs)/version.c: FORCE
$(GIT) rev-parse HEAD | awk ' BEGIN {print "#include \"version.h\""} {print "const char * build_git_sha = \"" $$0"\";"} END {}' > $(MyLibs)/version.c
date | awk 'BEGIN {} {print "const char * build_git_time = \""$$0"\";"} END {} ' >> $(MyLibs)/version.c
每次编译代码时,awk命令都会生成一个.c版本的文件,如下所示:
#define GIT_HASH \
"098709a0b098c098d0e"
echo #define GIT_HASH \ > file.h
echo " > file.h
echo git status <whatever cmd to get the hash> > file.h
echo " > file.h
#include "version.h"
const char * build_date = "2009-11-10 11:09";
const char * build_git_sha = "6b54ea36e92d4907aba8b3fade7f2d58a921b6cd";
#ifndef VERSION_H
#define VERSION_H
extern const char * build_date; /* 2009-11-10 11:09 */
extern const char * build_git_sha; /* 6b54ea36e92d4907aba8b3fade7f2d58a921b6cd */
#endif /* VERSION_H */
/* version.c */
#include "version.h"
const char * build_git_sha = "ac5bffc90f0034df9e091a7b3aa12d150df26a0e";
const char * build_git_time = "Thu Dec 3 18:03:58 EST 2009";
/*version.h*/
#ifndef VERSION_H_
#define VERSION_H_
extern const char * build_git_time;
extern const char * build_git_sha;
#endif /* VERSION_H_ */
我有一个静态版本的.h文件,如下所示:
#define GIT_HASH \
"098709a0b098c098d0e"
echo #define GIT_HASH \ > file.h
echo " > file.h
echo git status <whatever cmd to get the hash> > file.h
echo " > file.h
#include "version.h"
const char * build_date = "2009-11-10 11:09";
const char * build_git_sha = "6b54ea36e92d4907aba8b3fade7f2d58a921b6cd";
#ifndef VERSION_H
#define VERSION_H
extern const char * build_date; /* 2009-11-10 11:09 */
extern const char * build_git_sha; /* 6b54ea36e92d4907aba8b3fade7f2d58a921b6cd */
#endif /* VERSION_H */
/* version.c */
#include "version.h"
const char * build_git_sha = "ac5bffc90f0034df9e091a7b3aa12d150df26a0e";
const char * build_git_time = "Thu Dec 3 18:03:58 EST 2009";
/*version.h*/
#ifndef VERSION_H_
#define VERSION_H_
extern const char * build_git_time;
extern const char * build_git_sha;
#endif /* VERSION_H_ */
我的其余代码现在可以通过简单地包含version.h头来访问构建时和git哈希。总而言之,我告诉git忽略version.c,方法是在.gitignore文件中添加一行。这样git就不会经常给我合并冲突。希望这有帮助 我还使用git跟踪我的科学代码中的更改。我不想使用外部程序,因为它限制了代码的可移植性(例如,如果有人想在MSV上进行更改) 我的解决方案是只使用主分支进行计算,并使用预处理器宏
\uuuuuu DATE\uuuuu
和\uuuu time\uuuu
输出构建时间。这样我就可以用git日志检查它,看看我使用的是哪个版本。参考:
解决此问题的另一种优雅方法是将git日志包含到可执行文件中。
从git日志中生成一个对象文件,并将其包含到代码中。这一次,您使用的唯一外部程序是objcopy,但编码较少。ref:和如果您使用的是基于make的构建,可以将其放入Makefile中:
GIT_VERSION := "$(shell git describe --abbrev=4 --dirty --always --tags)"
(有关开关的功能,请参见)
然后将其添加到您的CFLAGS中:
-DVERSION=\"$(GIT_VERSION)\"
然后,您可以直接在程序中引用该版本,就好像它是一个#define:
默认情况下,这只打印一个缩写的git commit id,但也可以选择使用以下内容标记特定版本:
git tag -a v1.1 -m "Release v1.1"
然后将打印出:
Version: v1.1-2-g766d
也就是说,2次提交超过了v1.1,git提交id以“766d”开头
如果树中有未提交的更改,它将附加“-dirty”
没有依赖项扫描,因此您必须执行显式的makeclean
以强制更新版本。T