我正在使用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元数据,我不知道这会影响归档哈希吗?
答案 0 :(得分:2)
来自the git archive
documentation:
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}
。不幸的是,这将立即使您进入第一个非粗体句:当前时间用作存档中每个文件的修改时间。因此您必须将计算机时钟设置回来。您可以继续按字面意思使用HEAD
,但随后您将获得新的HEAD
提交时间,而不是之前的HEAD
提交时间,这会导致同样的问题。
如果有某种方法可以使用现有存档重新设置新存档上的时间戳,或者您可以比较剪下时间戳的文件(如果所有存档都相同,则切换回旧存档)或计算档案的散列减去时间戳,这将完成工作。
git archive
没有任何争论可以实现你想要的。修改Git源本身可以允许您指定特定的时间戳;见this region of the source code。