有没有办法在每次提交时在文件中包含git commit哈希?我只能在归档期间找到如何执行此操作,但我无法找到如何为每次提交执行此操作。
我正在使用git作为修订控件进行科学编程,因此这种功能对于重现性原因非常有用(即,git hash会自动包含在所有结果文件和数字中)。
答案 0 :(得分:2)
Greg在his answer中解释了为什么这是不可能的
?<revision-number>
to codes by Git/Svn”中所提到的,Git没有“关键字扩展”机制。
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,则没有开箱即用的解决方案,但您可以使用ident
和clean
命令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