为什么git存储库的部分克隆是不可能的?

为什么git存储库的部分克隆是不可能的?,git,Git,在与以下问题相关的回答中,需要注意的是,在任何情况下,都会下载完整的存储库(只有部分签出) 部分克隆(=只下载存储库的一部分)是不可能的,因为git的内部工作涉及快照和计算哈希 Q我说得对吗?将git存储库看作一个巨大的图形。实际上有一些 背后的复杂数学。。。所有文件/对象都以某种方式连接在一起,git的速度、灵活性和可靠性正是基于这种图形 (图片:) (图片:) 如果您不拥有整个图形,则很可能无法说出文件的整个历史记录、状态和路径,因为您缺少与该文件源的连接如果存储库的开头不存在子

在与以下问题相关的回答中,需要注意的是,在任何情况下,都会下载完整的存储库(只有部分签出)

部分克隆(=只下载存储库的一部分)是不可能的,因为git的内部工作涉及快照和计算哈希


Q我说得对吗?

将git存储库看作一个巨大的图形。实际上有一些 背后的复杂数学。。。所有文件/对象都以某种方式连接在一起,git的速度、灵活性和可靠性正是基于这种图形

(图片:)

(图片:)

如果您不拥有整个图形,则很可能无法说出文件的整个历史记录、状态和路径,因为您缺少与该文件源的连接如果存储库的开头不存在子目录,但后来移动到其中的某些文件已经存在于该目录之外,会发生什么情况?您将如何跟踪他们?

此外,(愚蠢的)服务器不可能确定 您需要哪些对象,因为git不使用自己的服务器应用程序,而是使用http服务器和ssh服务器。因此,远程服务器只能传送文件,而不能确定您实际需要哪些文件

Git?中签出子目录中接受的答案正好指出了这一点:

请注意,稀疏签出仍然要求您下载整个存储库,即使Git下载的一些文件最终不会出现在您的工作树中

因此,在git获得整个图形之后,它可以删除所有这些对象,因为(与服务器相反)它可以确定是否需要它们


更新:回答您的问题:快照都是通过哈希保存和引用的,所以是的,git的内部工作对此负责。

我认为这个答案回答了您的问题:请参阅git 2.17+的git部分克隆(或“窄克隆”):