这个帖子提到:
如果您不记得空树的SHA1值,您可以通过以下方式推导出它:
git hash-object -t tree /dev/null
Or, as Ciro Santilli proposes in the comments:
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)
git mktree <NUL
$null | git mktree
并补充道:
作为历史记录,现在被称为repo_read_object_file()
的函数在346245a1bb(“hard-code the empty tree object”,2008-02-13,Git v1.5.5-rc0 -- merge)中学习了空树。现在被称为oid_object_info()
的函数在c4d9986f5f("sha1_object_info
: examine cached_object
store too",2011-02-07,Git v1.7.4.1)中学习了空树。
注意,当作者想要其第一次提交为空时(请参见博客文章“
如何初始化我的Git存储库”),您将在某些GitHub仓库中看到SHA1弹出。
$ 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'
将会给你:
![Empty tree SHA1](https://istack.dev59.com/nk8fB.webp)
(看到树的SHA1了吗?)
你甚至可以将现有的历史记录重新基于那个空提交(参见“
git:如何将提交插入为第一个,移动所有其他提交?”)。
在这两种情况下,您不依赖于该空树的确切SHA1值。您只需遵循最佳实践,使用第一个空提交初始化您的存储库即可。
要做到这一点:
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"
这将生成一个与您的repo、用户名、电子邮件和创建日期特定的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上也可以使用Gnu On Windows命令
如下文所述,使用git diff <commit> HEAD
命令,将显示当前分支HEAD中所有文件的差异:
git diff --name-only 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD
注意:空树值在
cache.h
中有正式定义。
"4b825dc642cb6eb9a060e54bf8d69288fbee4904"
自 Git 2.16 (2018 年第一季度) 起,它被用于一个不再仅仅与 SHA1 相关的结构中,如
commit eb0ccfd 所示:
切换空树和 blob 查找以使用哈希抽象
将 empty_tree_oid
和 empty_blob_oid
的使用切换为使用 current_hash
抽象,该抽象表示当前正在使用的哈希算法。
查看更多信息,请参见 "
Why doesn't Git use more modern SHA?":自 Git 2.19 (2018 年第三季度) 起,它是
SHA-2。
随着 Git 2.25(2020年第一季度)的到来,测试正在为 SHA-2 过渡 做准备,并涉及空树。
请查看
commit fa26d5e,
commit cf02be8,
commit 38ee26b,
commit 37ab8eb,
commit 0370b35,
commit 0253e12,
commit 45e2ef2,
commit 79b0edc,
commit 840624f,
commit 32a6707,
commit 440bf91,
commit 0b408ca,
commit 2eabd38(2019年10月28日),以及
commit 1bcef51,
commit ecde49b(2019年10月5日)由
brian m. carlson (bk2204
)提交。
(由Junio C Hamano -- gitster
--在commit 28014c1中合并,2019年11月10日)
Signed-off-by: brian m. carlson
测试套件最终将学会如何使用除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
" 空树。
git hash-object -t tree /dev/null
方法具有不硬编码SHA-1的优点,以防未来某个版本的Git切换到SHA-2等其他哈希算法。(我不会预测何时会发生这种情况。 :-) 这将更容易地将Mercurial切换到SHA-2,因为他们为此留出了余地。) - torek6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321
将很快成为新的4b825dc642cb6eb9a060e54bf8d69288fbee4904
空树哈希。请参见下面我编辑过的答案。 - VonC