我使用git archive从存储库中的某个项目文件夹src
导出源代码,以便计算其组合的sha256哈希,如下所示:
git archive HEAD --worktree-attributes -o project-archive.zip src/
sha256sum project-archive.zip | awk '{ print $1 }' > project-archive.zip.hash
我的git属性文件位于项目的根目录,看起来有点像:
integration_tests/ export-ignore
src/unit_tests export-ignore
src/.* export-ignore
.git* export-ignore
.config.yml export-ignore
*.md export-ignore
这对于计算我的源代码的哈希很有效,但我发现对未包含在归档中的项目文件(如.config.yml
和integration_tests/foo.py
)的修改仍然会修改归档的哈希。
档案本身没有任何错误的文件。
每个
.py
文件的sha256散列保持不变。只有在我提交了无关的(未处理的)更改,所以我认为这是git行为或对git属性配置。
假设源文件上有一些我不知道的git元数据会影响存档哈希?
来自git archive
文档:
git-archive在给定树ID时与在给定提交ID或标记ID时的行为不同。在第一种情况下,当前时间用作存档中每个文件的修改时间。在后一种情况下,将使用引用的提交对象中记录的提交时间此外,如果使用tar格式,则提交ID存储在全局扩展的pax标头中;它可以使用git-get-tar-commit-id提取。在ZIP文件中,它被存储为文件注释。
(所有粗体都是我的)。由于您通过HEAD
提供提交ID,该提交ID将作为文件注释存储在zip归档中。如果压缩两个不同的提交,在压缩后,除了这个文件注释哈希ID之外,它们是相同的,那么zip文件的总校验和将不同。(去掉散列ID,zip文件的总校验和应该匹配,除了下面的时间戳问题。)
一个解决方案是显而易见的:提供提交的树ID而不是 当前时间被用作存档中每个文件的修改时间如果有某种方法可以使用现有档案来重新设置新档案的时间戳,或者如果您可以比较没有时间戳的文件(如果所有文件都相同,则切换回旧档案),或者计算档案减去时间戳后的哈希值,那就可以了。HEAD
,例如,使用HEAD^{tree}
。不幸的是,这会立即让你遇到第一个不粗体的句子:git archive
没有任何论据可以实现您想要的。修改Git源代码本身可以让你指定一个特定的时间戳;请参阅此区域的源代码。