在没有git的情况下分配目录的git SHA

时间:2016-04-15 21:49:53

标签: python git sha1

所以,我发现了这个问题: How to assign a Git SHA1's to a file without Git?

但我不确定如何为目录执行此方法。如何在不使用git的情况下散列程序中的目录,使其与git?

给出的sha1匹配

3 个答案:

答案 0 :(得分:4)

事实证明这比我想象的要难,但我现在确实有效。

作为I commentedhobbs 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 answerthis section of the Git book中描述。为了计算树对象的哈希值,您必须自己生成树。

对于目录中的每个项目,您需要做四件事:

  1. 它的名字。对象存储在按名称排序的树中(如果每个人都没有就规范顺序达成一致,那么每个人可能会对同一棵树有不同的表示形式和不同的哈希值。)
  2. 它的模式。模式基于Unix模式(st_mode的{​​{1}}字段),但主要使用的restricted to a few values:目录为040000,非可执行文件为100644,可执行文件为100755,以及符号链接120000。
  3. 表示该项目的对象的哈希值。对于文件,这是blob hash。对于符号链接,它是包含符号链接目标的blob的哈希值。对于子目录,它是 目录的树对象的散列,因此这是一个递归算法。
  4. 3中提到的对象的类型。
  5. 如果您收集目录中所有条目的此信息,并以正确的顺序写出正确格式的数据,您将拥有一个有效的树对象。如果计算此对象的SHA,则应该得到与git和GitHub相同的结果。