将Git SHA1信息扩展为签入而不归档?

时间:2010-05-17 22:01:24

标签: git hash scientific-computing

有没有办法在每次提交时在文件中包含git commit哈希?我只能在归档期间找到如何执行此操作,但我无法找到如何为每次提交执行此操作。

我正在使用git作为修订控件进行科学编程,因此这种功能对于重现性原因非常有用(即,git hash会自动包含在所有结果文件和数字中)。

5 个答案:

答案 0 :(得分:2)

Greghis answer中解释了为什么这是不可能的

  

ident

     

当为路径设置属性ident时,git用$Id$替换blob对象中的$Id:,后跟40个字符的十六进制blob对象名称,后跟一个美元结账时签署$   任何以$Id:开头且以$结尾的工作树文件中的字节序列在办理登机手续时都会被$Id$替换。

这意味着通常的解决方法是,通过some kind of build process在版本化但单独的文件中包含您需要的信息
在您的情况下,文件包含所有其他文件的列表及其SHA1值 例如,这些文件可能在每次提交时生成(修改刚刚发生的提交)。


作为单独文件的示例,Jefromi指出了Git本身的VERSION文件,由this script构建

elif test -d .git -o -f .git &&
         VN=$(git describe --match "v[0-9]*" --abbrev=4 HEAD 2>/dev/null) &&
         case "$VN" in
         *$LF*) (exit 1) ;;
         v[0-9]*)
                 git update-index -q --refresh
                 test -z "$(git diff-index --name-only HEAD --)" ||
                 VN="$VN-dirty" ;;
         esac
then

答案 1 :(得分:2)

您可以使用$Id$ keywork轻松地将文件的SHA-1(更准确地说是blob的SHA-1,即文件内容的SHA-1)和{ {1}} gitattribute

如果您想将提交的SHA-1,则没有开箱即用的解决方案,但您可以使用identclean命令smudge gitattribute。请注意,这会严重影响性能,因为在提交之后,必须修改每个文件以反映新的提交。


虽然正如在这个问题的其他答案中所说的那样,在构建时在生成的文件中嵌入版本号会做得更好,例如Linux内核和git项目本身就是这样做的。

答案 2 :(得分:1)

包含提交中包含的提交哈希内部文件必然会更改哈希值。为了通过SHA1哈希机制提供存储库完整性,Git不会(也不能)支持这样的功能。

答案 3 :(得分:0)

  

将git哈希自动包含在所有结果文件和数字中。

您可以以某种方式将哈希作为输入传递给程序(例如,作为环境变量)。

仅凭这一点并不能保证您传递正确的哈希值。

也许你可以编写一个脚本来检查特定的提交(通过hash或ref)到一个特殊的(或临时的)目录,进行自动构建,然后运行程序并将提交哈希作为输入传递给程序

通过这种方式,您可以更自信地获得正确的哈希值。

但是,仍然有人可以完全传递任何虚假的哈希,并产生误导性的数字。

答案 4 :(得分:0)

您只需使用以下bash脚本(将其保存为.git / hooks / post-commit)

#ifndef __version_h__
#define __version_h__

#define COMMIT "commit 2e44e754a9002c99bbf4c09e7827f307d5f0d6f9"
#define V_DATE "Sat Aug 20 19:35:47 2016 +0300"

#endif

作为参考,server / version.h应如下所示,每次提交后都会更新:

use strict;
use warnings 'all';

my $input = 1978;

while ( my $line = <DATA> ) {

    $line =~ s/\s*\z//;

    my $result = $line && $input && $line ne $input ? 'Fail' : 'Pass';

    printf "%4s %s\n", $line, $result;
}


__DATA__
1978
1989

1978
1999

1768