2017-08-04 100 views
0

所以我在专业的Git 3.1节横跨下面这段话来了:为什么在提交之前blob出现在存储库中?

“让我们假设你有一个包含三个文件的目录,并准备将它们暂存并提交暂存文件计算校验和为每一个(我们在入门指南中提到的SHA-1散列)将该版本的文件存储在Git存储库中(Git将它们称为blob),并将该校验和添加到临时区域“

我的问题是:为什么在我提交这些文件之前,git会“在Git存储库中存储该文件的一个版本”?

+1

这就是索引/分段区域的工作原理。它创建提交的所有部分,然后当您发出commit命令时,它将这些对象连接到您的历史记录。 – siride

+0

您可能有兴趣阅读https://matthew-brett.github.io/curious-git/curious_journey.html – mkrieger1

+0

澄清siride:因此git实际上并没有在提交blob时“移动”任何文件,它只是连接他们通过引入一个提交对象来引用你的blob通过树的历史。如果是这样的话,索引和存储库只会出现分离,但实际上依赖于相同的文件,对吧? – Jack

回答

2

Why questions are always tricky.

有一个非常机械的回答(这是我看到siride mentioned in a comment):Git的指数的内部结构,即Git使用以建立下一个犯那个神秘的对象,只存储BLOB哈希标识。因此,为了在的文件中有一个副本(以便它将在下一次提交中),它必须作为blob对象存储在存储库中。

有一个性能答案:通过在索引中存储散列ID,Git非常快速地进行新的提交。

有一个数据恢复答案(这是一种弱点):通过预先在存储库中存储blob,您可以通过git fsck --lost-found找回它一段时间,如果您不小心做了不好的事情。 (这里的弱点是,或者包括,如果blob与存储库中的现有blob相匹配,则它不会显示在找不到的搜索中;并且您将丢失文件的名称,这对理解其内容通常很重要)

有一个设计美学的答案:或许Linus认为git add file将文件复制到存储库的时间早于后面的git commit

你可以选择任何这些答案,或者自己组装!

相关问题