Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让我的C代码自动打印出它的Git版本哈希?_C_Git_Version Control_Workflow - Fatal编程技术网

如何让我的C代码自动打印出它的Git版本哈希?

如何让我的C代码自动打印出它的Git版本哈希?,c,git,version-control,workflow,C,Git,Version Control,Workflow,有没有一种简单的方法来编写可以访问其Git版本哈希的C代码 我用C语言编写软件,在实验室环境中收集科学数据。我的代码将收集的数据记录在一个.yaml文件中,以供以后分析。我的实验每天都在变化,我经常不得不修改代码。为了跟踪修订,我使用git存储库 我希望能够在我的.yaml数据文件中包含Git修订哈希作为注释。这样,我就可以查看.yaml文件并确切地知道使用什么代码生成该文件中显示的数据。有没有一种简单的方法可以自动执行此操作 您的程序可以在运行时或作为构建过程的一部分,使用git Descri

有没有一种简单的方法来编写可以访问其Git版本哈希的C代码

我用C语言编写软件,在实验室环境中收集科学数据。我的代码将收集的数据记录在一个.yaml文件中,以供以后分析。我的实验每天都在变化,我经常不得不修改代码。为了跟踪修订,我使用git存储库


我希望能够在我的.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
    文件中,并将
    $Id$
    放在适当的位置。它将自动扩展为文件内容的SHA-1标识符(blob id):这不是文件版本,也不是上次提交

    Git确实以这种方式支持$Id$关键字,以避免接触在分支切换、倒带分支等过程中未更改的文件。如果您确实希望Git在文件中放置提交(版本)标识符或描述,您可以(ab)使用
    过滤器
    属性,使用clean/smude过滤器扩展某些关键字(例如$Revision$)签出时,并清理它以进行提交

  • 您可以像Linux内核或Git本身一样,使用构建过程来为您实现这一点

    看看脚本及其在Git中的使用,或者举例来说,这个Makefile如何在生成/配置
    gitweb/gitweb.cgi
    文件期间嵌入版本信息

    GIT-VERSION-GEN使用GIT description生成版本描述。您需要更好地标记(使用签名/注释标记)项目的发布/里程碑


我最终使用了与@Kinopiko的答案非常相似的东西,但我使用了awk而不是perl。如果您的应用程序停留在windows机器上,而windows机器上安装的awk本质上是mingw,而不是perl,这将非常有用。下面是它的工作原理

我的makefile中有一行调用git、date和awk来创建c文件:

$(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