所以,我发现了这个问题: How to assign a Git SHA1's to a file without Git?
但我不确定如何为目录执行此方法。如何在不使用git的情况下散列程序中的目录,使其与git?
给出的sha1匹配答案 0 :(得分:4)
事实证明这比我想象的要难,但我现在确实有效。
作为I commented和hobbs answered,计算树形哈希是非常重要的。您必须散列每个子树中的每个文件,计算这些子树的哈希值,并使用这些哈希值计算顶级树的哈希值。
附加的python代码似乎适用于至少一些测试用例(例如,为git源本身计算树哈希)。作为评论,我提出了一些我在此过程中发现的意外事情的解释。
现在也在my github "scripts" repository。
[编辑:github版本现在有一些Python3修复,通常可能更新/更好。]
div ng-repeat="item in items" class="wrap"
答案 1 :(得分:1)
如何在不使用git的情况下散列程序中的目录,使其与git给出的sha1匹配?
完全没有 - git没有“哈希”目录。它散列包含的文件并具有树的表示;见the git object storage docs。
答案 2 :(得分:1)
git中目录中所有文件的状态由"树"表示。对象,在this SO answer和this section of the Git book中描述。为了计算树对象的哈希值,您必须自己生成树。
对于目录中的每个项目,您需要做四件事:
st_mode
的{{1}}字段),但主要使用的restricted to a few values:目录为040000,非可执行文件为100644,可执行文件为100755,以及符号链接120000。如果您收集目录中所有条目的此信息,并以正确的顺序写出正确格式的数据,您将拥有一个有效的树对象。如果计算此对象的SHA,则应该得到与git和GitHub相同的结果。