这给予了考虑文件名和内容的单个散列。 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,包括指定要包含的文件列表的能力。 ()排除哈希冲突
我想改进@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来获取目录,其中:
7条答案
按热度按时间6bc51xsx1#
根据你为什么要这么做,下面的git命令可能会很有用:
这给予了考虑文件名和内容的单个散列。
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,包括指定要包含的文件列表的能力。()排除哈希冲突
wbrvyc0a2#
git hash-object -t tree
期望file参数是描述树中条目的文件,而不是文件系统中的目录。我从注解here中了解到,此命令期望以二进制格式描述树的文件,并且使用git mktree
创建树对象会更容易。git mktree
理解你从git ls-tree HEAD
得到的格式的输入。有一个很好的例子,在Git Community Book中使用git hash-object
和git mktree
从头开始构造一个树。b91juud33#
我不确定是否能获得git仓库外目录(及其所有内容)的哈希值,但对于仓库内的目录,可以尝试只打印哈希值:
不需要使用需要额外处理的其他命令。
这也可以,但会提供您可能不需要的附加信息(如文件模式和其他数据):
abithluo4#
我遇到了同样的问题,破解了一个Python script to hash a complete directory,它的局限性在于它没有考虑到
.gitignore
文件,但到目前为止它已经达到了它的目的(散列目录,make commit对象,store it on thegh-pages
branch)。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
来获取目录,其中:"mode name\0hash"
的串联mode
对于文件是"100644"
,对于目录是"40000"
(注意,对于目录,没有前导零)mode
和name
由单个空格分隔,name
和hash
由单个字节\0
分隔hash
是对象散列的20字节长二进制表示name
排序,这似乎不是创建树对象所必需的,但通过比较两个目录的哈希值有助于确定它们是否等价--遗憾的是,我不知道这里应该使用哪种排序算法(特别是:如果是非ascii字符该怎么办)还要注意,这种二进制格式与树对象在存储库中的存储方式略有不同,因为它缺少
"tree SIZE\0"
头。显然,你必须自底向上计算,从最深的文件开始,因为你需要在计算父文件的哈希值之前计算所有子文件的哈希值。
lg40wkob6#
正如马克·朗格尔所说,mktree是一条可行之路。
我也遇到了同样的问题,我费了很大劲才解决了这个问题。我是这样做的:
这将给予你一个目录的内容列表及其哈希值。
然后,您可以在文本编辑器中将此列表转换为ls-tree格式,并
rslzwgfq7#
经过长时间的搜索,我找到了以下命令:
来源:http://git-scm.com/docs/git-write-tree
我用它来恢复丢失的目录:
并且我的missing tree对象已经创建。从这里你可以继续使用:
如中所解释:www.example.comhttps://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F