如何计算目录的git hash-object?

Fra*_*man 15 git

有没有人有一个在目录上使用git hash-object的例子?它在文件上很容易工作*但是不能像我期望的那样工作**

*:  git hash-object c:\somefile.txt
**: git hash-object -t tree c:\somedirectory
Run Code Online (Sandbox Code Playgroud)

当我尝试在目录中使用hash-object时,它会抱怨"致命:无法打开'C:\ someDirectory':权限被拒绝"

Mar*_*air 14

git hash-object -t tree期望file参数是描述树中条目的文件,而不是文件系统中的目录.我从这里的评论中理解,这个命令期望一个文件以二进制格式描述树,并且它更容易git mktree用于创建树对象.

git mktree了解您获得的格式的输入(例如)git ls-tree HEAD.有一个很好的例子,使用git hash-objectgit mktreeGit社区书中从头开始构建一个树.

  • +1并欢迎来到10K世界及其版主工具;) (3认同)

Eri*_*ikE 7

我不确定是否要获取 git 存储库外部目录的哈希值,但是对于存储库内部的目录,请尝试仅打印哈希值:

git rev-parse HEAD:some/directory
Run Code Online (Sandbox Code Playgroud)

无需使用其他需要额外处理的命令。

这也可以工作,但会提供您可能不想要的其他信息(例如文件模式和其他数据):

git ls-tree HEAD some/directory
Run Code Online (Sandbox Code Playgroud)


And*_*yke 6

根据您希望这样做的原因,以下git命令可能会有用:

git ls-files -s somedirectory | git hash-object --stdin
Run Code Online (Sandbox Code Playgroud)

这给出了一个考虑文件名和内容的哈希值。

它是这样的。的git ls-files -s ....输出文件和它们作为文本到散列的列表stdout,然后git hash-object生成用于从它接收数据的散列stdin

我的用例如下-我想知道一个分支中目录中的(git管理)文件是否与另一个分支中的文件完全匹配(*)。具体用途是比较“目录哈希”,决定是否需要重新生成缓存的派生文件。

默认情况下git ls-files也会在子目录中列出文件。如果您不希望这样做,请尝试查看“仅在一个目录级别上如何git ls-file的答案。git ls-files还有其他多种选择,包括指定要包含的文件列表的功能。

(*)排除哈希冲突

  • 我认为`git ls-tree HEAD somedirectory`就足够了,git已经对目录进行了哈希处理。无需对整个目录执行ls-files并使用git hash-object重新对其进行哈希处理。 (2认同)
  • 我想如果您需要将哈希计算中包含的文件限制为特定文件扩展名或排除子目录,我上面的较长解决方案可能会很方便。 (2认同)