git如何存储文件?


225

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

但是我并没有真正了解快照的含义。git是否真的在每个提交中都复制了所有文件,因为我从它们的解释中了解到这一点。

PS:如果有人能更好地学习git,我将不胜感激。


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

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

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

Answers:


275

Git确实为每个提交包含所有文件的完整副本,除了,对于Git存储库中已经存在的内容,快照将仅指向该内容,而不是对其进行复制。
这也意味着具有相同内容的多个文件仅存储一次。

因此,快照基本上是一种提交,是指目录结构的内容

一些好的参考资料是:

您告诉Git您想要使用git commit命令保存项目的快照,并且它基本上记录了此时项目中所有文件的清单。

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


progit书对快照有更全面的描述:

Git与任何其他VCS(包括Subversion和好友)之间的主要区别在于Git考虑其数据的方式。
从概念上讲,大多数其他系统将信息存储为基于文件的更改的列表。这些系统(CVS,Subversion,Perforce,Bazaar等)将它们保存为一组文件的信息,并随时间对每个文件进行更改

基于增量的VCS

Git不会以这种方式考虑或存储其数据。相反,Git认为其数据更像是一个小型文件系统的快照集。
每次您提交或将项目状态保存在Git中时,它基本上都会拍下当时所有文件的样子,并存储对该快照的引用。
为了提高效率,如果文件没有更改,Git不会再次存储该文件-只是指向它已经存储的先前相同文件的链接。
Git更像是考虑其数据,如下所示:

基于快照的VCS

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


Jan Hudec添加了此重要评论

尽管这在概念级别上是正确且重要的,但在存储级别上却并非如此。
Git确实使用增量存储
不仅如此,它在效率上也比其他任何系统都高。因为它不保留每个文件的历史记录,所以当它想进行增量压缩时,它会提取每个斑点,选择一些可能相似的斑点(使用试探法,其中包括先前版本的近似,以及其他一些近似法),尝试生成增量并选择最小的增量。这样,它可以(通常取决于启发式方法)利用其他比以前更相似的类似文件或旧版本。“ pack window”参数允许以增量压缩质量进行交易。默认值(10)通常会给出不错的结果,但是当空间有限或为了加快网络传输时,git gc --aggressive使用值250,这使其运行非常慢,但会为历史数据提供额外的压缩。


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

1
有谁知道类似Git的存储模式(又名基于哈希的值存储)的计算机科学术语?(或类似的内容)
乔安妮斯·维尔莫尔

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

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

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

46

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

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

拉或推时(至少使用某些协议)也使用相同的格式,因此不必再次重新压缩这些文件。

这样的结果是,包含整个未压缩工作副本,未压缩最近文件和压缩较旧文件的git存储库通常相对较小,比工作副本的大小小两倍。这意味着它比具有相同文件的SVN存储库小,即使SVN不在本地存储历史记录也是如此。


1
嗯,这样就更有效地利用空间了
Ben
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.