我刚刚开始学习git,为此,我开始阅读Git社区手册,在这本书中,他们说SVN和CVS存储文件之间的差异,而git存储所有文件的快照。

但是我并没有真正了解快照的含义。 git确实会在每次提交中复制所有文件的副本,因为我从它们的解释中可以理解。 >

评论

这是一篇精彩的文章,详细介绍了git的工作原理。您正在寻找的可能是有关对象数据库的§。

出色的文章,其中包含其他重要资源的链接。我玩了几个小时。

我发现这篇非常好的文章从内到外描述了git:maryrosecook.com/blog/post/git-from-the-inside-out

#1 楼

Git确实为每个提交都包括了所有文件的完整副本,只是对于Git存储库中已经存在的内容,快照将仅指向该内容,而不是对其进行复制。
这也意味着多个文件具有相同内容的内容只能存储一次。
因此快照基本上是一个提交,它引用目录结构的内容。
一些好的参考文献是:

git.github .io / git-reference


您告诉Git您想使用git commit命令保存项目的快照,并且它基本上记录了项目中所有文件的清单看起来就像在那个时候



实验12说明了如何获取以前的快照


“您可能已经发明了git(也许您已经发明了git)”


什么是git“快照”?


了解GitHub


>
progit书对快照进行了更全面的描述:

Git与任何其他VCS(包括Subversion和好友)之间的主要区别在于Git对数据的看法。 br />从概念上讲,大多数其他系统将信息存储为基于文件的更改的列表。这些系统(CVS,Subversion,Perforce,Bazaar等)将它们保存为一组文件的信息以及随着时间的推移对每个文件所做的更改。
或以这种方式存储其数据。相反,Git认为其数据更像是一个小型文件系统的快照集。
每次提交或在Git中保存项目状态时,它基本上都会对所有文件的外观进行拍照。此时,并存储对该快照的引用。
为了提高效率,如果文件没有更改,Git不会再次存储该文件-只是指向它已经存储的先前相同文件的链接。
Git对数据的考虑如下所示:

这是Git与几乎所有其他VCS之间的重要区别。它使Git可以重新考虑版本控制的几乎所有方面,这是大多数其他系统从上一代复制而来的。这使得Git更像是一个微型文件系统,在其之上构建了一些功能非常强大的工具,而不是简单的VCS。

另请参见:文件快照,为什么.git/不会随着时间的流逝而变得庞大?“
”每个git commit的树对象内容中存储了什么信息“ :

虽然在概念级别上是正确且重要的,但在存储级别上并非如此。Git确实使用增量存储。任何其他系统。因为它不保留每个文件的历史记录,所以当它想要进行增量压缩时,它将采用每个blob,选择一些可能相似的blob(使用试探法,其中包括与以前版本最接近的近似法,以及其他一些近似法),生成增量并选择最小的增量。这样,它可以(通常取决于启发式方法)利用其他比以前更相似的类似文件或较旧的版本。 “打包窗口”参数可实现增量压缩质量的交易性能。默认值(10)通常会得到不错的结果,但是当空间有限或为了加快网络传输速度时,git gc --aggressive使用值250,这使其运行非常缓慢,但为历史记录数据提供了额外的压缩。

评论


@JanHudec好点。我已将您的评论包含在答案中,以提高知名度。

–VonC
2013年1月3日14:00

有人知道类似Git的存储模式(又名基于哈希的值存储)的计算机科学术语吗? (或类似的东西)

–乔安妮斯·维尔莫尔(Joannes Vermorel)
2014年11月24日12:00

在OP的实际问题中,第一段似乎确实令人误解。直到您到达最后一段,我们才知道,哦,是的,事实上,Git确实“存储了文件之间的差异。真希望信息被标记在最前面,而不是埋得太深。至少在您的答案中包括真实的故事;)

–乔什·奥布莱恩(Josh O'Brien)
15年1月27日在20:50



@NickVolynkin太好了!我很高兴这些答案能吸引更多的听众。

–VonC
2015年8月21日在14:15

另一本好书:《自下而上的Git》:ftp.newartisans.com/pub/git.from.bottom.up.pdf

–乔纳斯·柏林(Jonas Berlin)
17年8月21日在19:34

#2 楼

Git在逻辑上将每个文件存储在其SHA1下。这意味着如果存储库中有两个内容完全相同的文件(或重命名文件),则仅存储一个副本。

但这也意味着当您修改一个小文件时,文件和提交的一部分,则存储该文件的另一个副本。 git解决此问题的方法是使用打包文件。有时,从回购中收集所有“松散”文件(实际上不仅是文件,还包含提交和目录信息的对象),并将其压缩到打包文件中。打包文件使用zlib压缩。并且类似的文件也经过delta压缩。

在拉或推时(至少在某些协议中)也使用相同的格式,因此不必再次重新压缩这些文件。 >
这样的结果是,包含整个未压缩工作副本,未压缩最新文件和压缩较旧文件的git存储库通常相对较小,比工作副本的大小小两倍。这意味着它比具有相同文件的SVN存储库小,即使SVN不在本地存储历史记录。

评论


嗯,这样比较节省空间

–本
16/09/13在23:47