该线程提到:
如果您不记得空树sha1,则可以始终使用以下方法派生它:
git hash-object -t tree /dev/null
或者,正如Ciro Santilli 在评论中建议的那样:
printf '' | git hash-object --stdin -t tree
或者,如从此处看到的,来自Colin Schimmelfing:
git hash-object -t tree --stdin < /dev/null
因此,我想用该命令的结果将变量定义为空的sha1树会更安全(而不是依赖“众所周知的值”)。
注意:Git 2.25.1(2020年2月)在commit 9c8a294中提出:
empty_tree=$(git mktree </dev/null)
# Windows:
git mktree <NUL
并添加:
作为历史记录,该函数现在repo_read_object_file()
在346245a1bb中被教导为空树(“对空树对象进行硬编码”,2008-02-13,Git v1.5.5-rc0- merge),并且该函数现在已知正如oid_object_info()
在c4d9986f5f中讲授的空树(“ sha1_object_info
:也检查cached_object
商店”,2011-02-07,Git v1.7.4.1)一样。
请注意,当作者希望其第一次提交为空时,您将看到SHA1在某个GitHub存储库上弹出(请参阅博客文章“ 如何初始化Git存储库 ”):
$ GIT_AUTHOR_DATE="Thu, 01 Jan 1970 00:00:00 +0000" GIT_COMMITTER_DATE="Thu, 01 Jan 1970 00:00:00 +0000" git commit --allow-empty -m 'Initial commit'
会给你:

(看到树SHA1吗?)
您甚至可以在该空提交的基础上重新建立现有的历史记录(请参阅“ git:如何首先插入一个提交,并转移所有其他提交? ”)
在这两种情况下,您都不依赖于该空树的确切SHA1值。
您只需遵循最佳实践,并使用第一个空commit初始化您的仓库。
要做到这一点:
git init my_new_repo
cd my_new_repo
git config user.name username
git config user.email email@com
git commit --allow-empty -m "initial empty commit"
这将生成带有特定于您的存储库,用户名,电子邮件,创建日期的SHA1的提交(这意味着提交的SHA1每次都会不同)。
但是该提交引用的树将是4b825dc642cb6eb9a060e54bf8d69288fbee4904
空树SHA1。
git log --pretty=raw
commit 9ed4ff9ac204f20f826ddacc3f85ef7186d6cc14
tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 <====
author VonC <vonc@laposte.net> 1381232247 +0200
committer VonC <vonc@laposte.net> 1381232247 +0200
initial empty commit
要仅显示提交树(显示提交树SHA1):
git show --pretty=format:%T 9ed4ff9ac204f20f826ddacc3f85ef7186d6cc14
4b825dc642cb6eb9a060e54bf8d69288fbee4904
如果引用空树的提交确实是您的第一个提交,则可以使用以下命令显示空树SHA1:
git log --pretty=format:%h --reverse | head -1 | xargs git show --pretty=format:%T
4b825dc642cb6eb9a060e54bf8d69288fbee4904
(甚至在Windows上也可以使用Windows上的Gnu命令运行)
正如下面的评论,使用git diff <commit> HEAD
,这将显示在目前的分公司负责所有的文件:
git diff --name-only 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD
注意:空树值在中正式定义cache.h
。
#define EMPTY_TREE_SHA1_HEX \
"4b825dc642cb6eb9a060e54bf8d69288fbee4904"
从Git 2.16(Q1 2018)开始,它用于不再与(仅)SHA1绑定的结构中,如在提交eb0ccfd中所示:
切换空树和Blob查找以使用哈希抽象
开关的用途empty_tree_oid
和empty_blob_oid
使用current_hash
,表示当前使用的哈希算法抽象。
在“ 为什么Git不使用更现代的SHA? ”中查看更多信息:自Git 2.19(2018年第三季度)以来,它是SHA-2。
使用Git 2.25(Q1 2020),测试正在为SHA-2过渡做准备,并且涉及到空树。
见提交fa26d5e,提交cf02be8,提交38ee26b,提交37ab8eb,提交0370b35,提交0253e12,提交45e2ef2,提交79b0edc,提交840624f,提交32a6707,提交440bf91,提交0b408ca,提交2eabd38(2019年10月28日),以及提交1bcef51,提交ecde49b(2019年10月5日)by brian m。卡尔森(bk2204
)。
(由Junio C gitster
Hamano合并--在提交28014c1中,2019年11月10日)
签字人:brian m。卡尔森
测试人员最终将学习如何使用SHA-1以外的算法运行。为此,请教test_oid
函数系列如何查找空的blob和空的树值,以便可以使用它们。
所以t/oid-info/hash-info
现在包括:
rawsz sha1:20
rawsz sha256:32
hexsz sha1:40
hexsz sha256:64
zero sha1:0000000000000000000000000000000000000000
zero sha256:0000000000000000000000000000000000000000000000000000000000000000
algo sha1:sha1
algo sha256:sha256
empty_blob sha1:e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
empty_blob sha256:473a0f4c3be8a93681a267e3b1e9a7dcda1185436fe141f7749120a303721813
empty_tree sha1:4b825dc642cb6eb9a060e54bf8d69288fbee4904
empty_tree sha256:6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321
SHA2“ 6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321
”是新的SHA1“ 4b825dc642cb6eb9a060e54bf8d69288fbee4904
”空树。