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

gojuced7  于 2023-03-06  发布在  Git
关注(0)|答案(7)|浏览(116)

有人有在目录上使用git hash-object的例子吗?它在文件上很容易工作 ,但在目录上却不像我所期望的那样工作*

*:  git hash-object c:\somefile.txt
**: git hash-object -t tree c:\somedirectory

当我尝试对目录使用hash-object时,它会抱怨"fatal:无法打开"C:\某个目录":权限被拒绝"

6bc51xsx

6bc51xsx1#

根据你为什么要这么做,下面的git命令可能会很有用:

git ls-files -s somedirectory | git hash-object --stdin

这给予了考虑文件名和内容的单个散列。
git ls-files -s ....将文件列表及其哈希值以文本形式输出到stdout,然后git hash-object为从stdin接收到的数据生成哈希值。
我的用例是这样的-我想知道一个分支目录中的(git管理的)文件是否与另一个分支目录中的文件完全匹配()。具体的用法是比较“目录哈希”,决定我是否需要重新生成缓存的派生文件。
默认情况下git ls-files也会列出子目录中的文件。如果你不想这样,可以试试answers to "how to git ls-file for just one directory level。还有很多其他的options to git ls-files,包括指定要包含的文件列表的能力。
)排除哈希冲突

wbrvyc0a

wbrvyc0a2#

git hash-object -t tree期望file参数是描述树中条目的文件,而不是文件系统中的目录。我从注解here中了解到,此命令期望以二进制格式描述树的文件,并且使用git mktree创建树对象会更容易。
git mktree理解你从git ls-tree HEAD得到的格式的输入。有一个很好的例子,在Git Community Book中使用git hash-objectgit mktree从头开始构造一个树。

b91juud3

b91juud33#

我不确定是否能获得git仓库外目录(及其所有内容)的哈希值,但对于仓库内的目录,可以尝试只打印哈希值:

git rev-parse HEAD:some/directory

不需要使用需要额外处理的其他命令。
这也可以,但会提供您可能不需要的附加信息(如文件模式和其他数据):

git ls-tree HEAD some/directory
abithluo

abithluo4#

我遇到了同样的问题,破解了一个Python script to hash a complete directory,它的局限性在于它没有考虑到.gitignore文件,但到目前为止它已经达到了它的目的(散列目录,make commit对象,store it on the gh-pages branch)。

z9gpfhce

z9gpfhce5#

我想改进@Fred Foo的回答,通过提供他的脚本的修改版本,它的不同之处在于它不存储存储库中的文件和目录作为计算其散列的副作用:http://pastebin.com/BSNGqsqC
不幸的是,我不知道有什么方法可以强制git mktree不在存储库中创建树对象,因此代码必须生成树的二进制表示并将其传递给git hash-object -t tree
此脚本也基于What is the internal format of a git tree object?的答案
一般的想法是使用git hash-object -- data.txt来获取文件的哈希值,并使用git hash-object --stdin -t tree < TreeDescription来获取目录,其中:

  • TreeDescription是"mode name\0hash"的串联
  • mode对于文件是"100644",对于目录是"40000"(注意,对于目录,没有前导零)
  • modename由单个空格分隔,
  • namehash由单个字节\0分隔
  • hash是对象散列的20字节长二进制表示
  • 条目按name排序,这似乎不是创建树对象所必需的,但通过比较两个目录的哈希值有助于确定它们是否等价--遗憾的是,我不知道这里应该使用哪种排序算法(特别是:如果是非ascii字符该怎么办)

还要注意,这种二进制格式与树对象在存储库中的存储方式略有不同,因为它缺少"tree SIZE\0"头。
显然,你必须自底向上计算,从最深的文件开始,因为你需要在计算父文件的哈希值之前计算所有子文件的哈希值。

lg40wkob

lg40wkob6#

正如马克·朗格尔所说,mktree是一条可行之路。
我也遇到了同样的问题,我费了很大劲才解决了这个问题。我是这样做的:

git ls-files -s directory_path

这将给予你一个目录的内容列表及其哈希值。
然后,您可以在文本编辑器中将此列表转换为ls-tree格式,并

echo -e "{ls-tree format list}" | git mkdir
rslzwgfq

rslzwgfq7#

经过长时间的搜索,我找到了以下命令:

    • 一月一日**

来源:http://git-scm.com/docs/git-write-tree
我用它来恢复丢失的目录:

    • 一米一米一**

并且我的missing tree对象已经创建。从这里你可以继续使用:

    • 一米二米一x**

如中所解释:www.example.comhttps://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F

相关问题