有没有办法在我每次提交时在文件中包含 git commit 哈希?我只能在归档期间找到如何执行此操作,但我无法找到如何为每次提交执行此操作。
我正在使用 git 作为修订控制进行科学编程,因此这种功能对于可重复性原因非常有帮助(即,将 git 哈希自动包含在所有结果文件和图形中)。
有没有办法在我每次提交时在文件中包含 git commit 哈希?我只能在归档期间找到如何执行此操作,但我无法找到如何为每次提交执行此操作。
我正在使用 git 作为修订控制进行科学编程,因此这种功能对于可重复性原因非常有帮助(即,将 git 哈希自动包含在所有结果文件和图形中)。
?<revision-number>
to codes by Git/Svn ”中所述,Git 有没有“关键字扩展”机制。
ident
当
ident
为路径设置属性时,git$Id$
在 blob 对象中替换为$Id:
,后跟 40 个字符的十六进制 blob 对象名称,然后是$
结帐时的美元符号。
任何以工作树文件开头$Id:
和结尾的字节序列都会$
在签入时替换为$Id$
。
这意味着通常的解决方法是,通过某种构建过程,将您需要的信息包含在一个版本化但单独的文件中。
在您的情况下,一个包含所有其他文件列表及其 SHA1 值的文件。
例如,此类文件可能会在每次提交时生成(修改刚刚发生的提交)。
作为单独文件的示例,Jefromi指出了VERSION
Git 本身的文件,由该脚本构建
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
您可以使用keywork 和gitattribute轻松放置文件的 SHA-1 (更准确地说是 blob 的 SHA-1,即文件内容的 SHA-1)。$Id$
ident
如果要放入commit的 SHA-1,没有开箱即用的解决方案,但可以使用gitattributeclean
和smudge
命令。请注意,这会严重影响性能,因为在提交后必须修改每个文件以反映所做的新提交。filter
尽管正如在此问题的其他答案中所说,在构建时将版本号嵌入生成的文件中会做得更好,例如 Linux 内核和 git 项目本身就可以做到这一点。
在提交中包含的文件中包含提交哈希必然会更改哈希。为了通过 SHA1 哈希机制提供存储库完整性,Git 不(也不能)支持这样的功能。
将 git 哈希自动包含在所有结果文件和图形中。
您可以以某种方式将散列作为输入传递给程序(例如,作为环境变量)。
不过,仅此一项并不能保证您传递了正确的哈希值。
也许您可以编写一个脚本,将特定提交(通过哈希或引用)签出到特殊(或临时)目录,执行自动构建,然后运行程序并将提交哈希作为输入传递给程序。
这样,您将更有信心获得正确的哈希值。
但是,仍然有人可以完全通过任何虚假哈希并创建误导性数字。
您可以简单地使用以下 bash 脚本(将其保存到 .git/hooks/post-commit)
#!/bin/bash
# break self-recursiveness
git log | head -n6 | grep -q 'version.h update' && exit 0
commit_id=`git log | head -n3 | grep commit`
v_date=`git log | head -n3 | grep -i date | sed 's|[dD]ate:\s*\(.*\)|\1|'`
sed -i "s|#define COMMIT.*|#define COMMIT \"${commit_id}\"|" server/version.h
sed -i "s|#define V_DATE.*|#define V_DATE \"${v_date}\"|" server/version.h
git commit -m"version.h update" server/version.h
exit 0
作为参考, server/version.h 应该是这样的,每次提交后都会更新:
#ifndef __version_h__
#define __version_h__
#define COMMIT "commit 2e44e754a9002c99bbf4c09e7827f307d5f0d6f9"
#define V_DATE "Sat Aug 20 19:35:47 2016 +0300"
#endif