大型项目的git历史数据

大型项目的git历史数据,git,diff,Git,Diff,我是git的新手,试图理解其原理。据我所知,在Git中,每个文件都完全按照和存储。然而,GitBook还指出了压缩二进制文件并计算文本文件差异的GitGC,该语句似乎与git存储完整文件的第一点相矛盾 1) 有人能解释一下哪一个是正确的吗?如果git-gc确实计算了部分差异,并且如果它在很长一段时间后运行,那么这是否将确保从基本版本到所有分支创建所有差异?如果git gc没有定期运行,这是否意味着需要大量的计算时间 2) 考虑到像Android这样有大量源文件和资源文件的项目,这似乎表明git将

我是git的新手,试图理解其原理。据我所知,在Git中,每个文件都完全按照和存储。然而,GitBook还指出了压缩二进制文件并计算文本文件差异的GitGC,该语句似乎与git存储完整文件的第一点相矛盾

1) 有人能解释一下哪一个是正确的吗?如果git-gc确实计算了部分差异,并且如果它在很长一段时间后运行,那么这是否将确保从基本版本到所有分支创建所有差异?如果git gc没有定期运行,这是否意味着需要大量的计算时间


2) 考虑到像Android这样有大量源文件和资源文件的项目,这似乎表明git将随着每次提交而膨胀。当开发者拉Android源代码时,如果它拉取所有源代码和二进制文件的整个历史记录,不是会占用很多空间吗?我是不是遗漏了什么?从长远来看,这是如何可持续的?

git gc
用于清理/压缩存储库中的松散对象。它通过打包对象(文件/树/提交的每个完整状态)来实现这一点。差异可以从以前的文件创建,也可以从一个完全无关但内容与git相似的文件创建


如前所述,为了解决问题2,git确实打包了对象。虽然从概念上讲,每个文件都有一个完整的副本,但当运行
gc
时,它们会被打包起来。至于存储二进制文件,git gc用于清理/压缩存储库中的松散对象。它通过打包对象(文件/树/提交的每个完整状态)来实现这一点。差异可以从以前的文件创建,也可以从一个完全无关但内容与git相似的文件创建


如前所述,为了解决问题2,git确实打包了对象。虽然从概念上讲,每个文件都有一个完整的副本,但当运行
gc
时,它们会被打包起来。至于存储二进制文件,Git是一个奇特的内容寻址文件系统。理论上,它存储每个版本中每个文件的完整内容,每个blob(文件内容)都有一个sha,可以通过它检索。在幕后,git实际上能够将一个文件作为与类似文件(通常是以前的版本,但不一定是这样)的差异来存储,但这完全发生在git存储文件的最低级别上。不仅git用户不必考虑它,甚至大多数git工具也不必考虑它

至于大小问题,因为“git文件系统”中有各种形式的压缩,而且效率很高,所以包含项目整个历史的
.git
目录通常比在项目达到数十万次提交之前对代码进行一次签出要小


如果一个存储库确实变得难以管理,那么(借助于诸如git graft之类的工具)可以将一个项目的历史拆分为不同的存储库,按照新的/古老的历史、活动的/归档的分支或其他类似的方式。git是一个奇特的内容寻址文件系统。理论上,它存储每个版本中每个文件的完整内容,每个blob(文件内容)都有一个sha,可以通过它检索。在幕后,git实际上能够将一个文件作为与类似文件(通常是以前的版本,但不一定是这样)的差异来存储,但这完全发生在git存储文件的最低级别上。不仅git用户不必考虑它,甚至大多数git工具也不必考虑它

至于大小问题,因为“git文件系统”中有各种形式的压缩,而且效率很高,所以包含项目整个历史的
.git
目录通常比在项目达到数十万次提交之前对代码进行一次签出要小


如果一个存储库确实变得难以管理,那么(借助于诸如
git graft
之类的工具)可以将一个项目的历史按照新的/古老的历史或活动的/归档的分支拆分为不同的存储库,或者其他类似的事情。

git gc计算存储差异的方式不一定与文件的历史记录相关。事实上,我记得在某个地方读过,但目前找不到参考资料,它很可能会选择“基础”的最新版本,因为这些是你最有可能检查的版本。如果您有10000个修订并且正在签出最新版本,则不希望将10000个差异应用于修订1以获得所需的版本


某些操作会自动运行
git gc
pull
是其中之一,因此您不太可能在运行它之间花费很长时间。如果你愿意的话,没有什么可以阻止你在每次提交后运行它。本质上,这就是其他版本控制系统在幕后所做的,也是git如此之快的主要原因之一。

git gc计算存储差异的方式不一定与文件的历史记录有关。事实上,我记得在某个地方读过,但目前找不到参考资料,它很可能会选择“基础”的最新版本,因为这些是你最有可能检查的版本。如果您有10000个修订并且正在签出最新版本,则不希望将10000个差异应用于修订1以获得所需的版本

某些操作会自动运行
git gc
pull
是其中之一,因此您不太可能在运行它之间花费很长时间。如果你是这样的话,没有什么可以阻止你在每次提交后运行它