5

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

我正在使用 git 作为修订控制进行科学编程,因此这种功能对于可重复性原因非常有帮助(即,将 git 哈希自动包含在所有结果文件和图形中)。

4

5 回答 5

2

格雷格他的回答中解释了为什么这是不可能的

ident

ident为路径设置属性时,git$Id$在 blob 对象中替换为$Id:,后跟 40 个字符的十六进制 blob 对象名称,然后是$结帐时的美元符号。
任何以工作树文件开头$Id:和结尾的字节序列都会$在签入时替换为$Id$

这意味着通常的解决方法是,通过某种构建过程,将您需要的信息包含在一个版本化但单独的文件中。
在您的情况下,一个包含所有其他文件列表及其 SHA1 值的文件。
例如,此类文件可能会在每次提交时生成(修改刚刚发生的提交)。


作为单独文件的示例,Jefromi指出了VERSIONGit 本身的文件,由该脚本构建

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
于 2010-05-18T04:04:38.733 回答
2

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

如果要放入commit的 SHA-1,没有开箱即用的解决方案,但可以使用gitattributecleansmudge命令。请注意,这会严重影响性能,因为在提交后必须修改每个文件以反映所做的新提交。filter


尽管正如在此问题的其他答案中所说,在构建时将版本号嵌入生成的文件中会做得更好,例如 Linux 内核和 git 项目本身就可以做到这一点。

于 2010-05-18T12:57:46.873 回答
1

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

于 2010-05-17T22:06:18.653 回答
0

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

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

不过,仅此一项并不能保证您传递了正确的哈希值。

也许您可以编写一个脚本,将特定提交(通过哈希或引用)签出到特殊(或临时)目录,执行自动构建,然后运行程序并将提交哈希作为输入传递给程序。

这样,您将更有信心获得正确的哈希值。

但是,仍然有人可以完全通过任何虚假哈希并创建误导性数字。

于 2010-05-18T00:03:44.940 回答
0

您可以简单地使用以下 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
于 2016-08-20T16:38:26.093 回答