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

时间:2016-02-23 08:27:31

标签: git

在与以下问题相关的答案中,注意到在任何情况下都会下载完整的存储库(只有结账是部分的)。

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

我说错了吗?

1 个答案:

答案 0 :(得分:1)

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

Git object Graph example (图片:http://web.mit.edu/6.005/www/fa15/classes/05-version-control/

Git object Graph example 2 (图片:http://evadeflow.com/wp-content/uploads/2011/01/git_object_graph_thumb.png

如果您不拥有整个图表,很可能您无法分辨文件的整个历史记录,状态和路径,因为您错过了与此文件来源的连接。 如果子目录在存储库的开头不存在,但后来移入其中的某些文件已经存在于目录之外,会发生什么?你会如何跟踪它们?

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

Git中 Checkout子目录中接受的答案指出了这一点:

  

请注意,稀疏检出仍然需要您下载整个存储库,即使Git下载的某些文件不会在您的工作树中结束。

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

更新:回答您的问题:快照全部由哈希保存和引用,是的,git的内部工作负责此事。