Git的存储机制

快照记录的是不是文件的每一个版的全部内容,而不是内容的变更信息? 如果这样,岂不是耗费很大的存储空间?

答:
git在正确的抽象层次上处理存储空间压缩,使得程序比上代(如svn)和同时代(如bzr)的VCS大为简化。

之前的VCS从节省空间出发,想当然地把delta作为基础数据结构。这样的最大问题(远不是唯一问题)是:delta设计时没有考虑到的修改方式就无法表达。例如,svn早期版本及更早的VCS不能记录文件rename/copy,所以只要重命名文件,列出历史时重命名之前的历史就显示不出来。

git的存储层(plumbing layer)提供的接口里,每个commit都记录完整的目录树。存储空间压缩问题完全在存储层内部解决:

  1. 逻辑上,存储层是一个CAS(Content-Addressable Storage)。这意味着在一个commit中,所有没改变的文件和目录都不额外占用存储空间。进一步,两个目录中内容相同的文件也只占用一份存储空间;甚至,两个文件的任意两个历史版本只要内容相同,就只占用一份存储空间。这是基于delta的VCS做不到的。
  2. 而对于同一个文件的历史版本的压缩,git的做法是把全部文件的历史版本统一处理,把文件间相同的片段进行压缩。这意味着两个不相干的文件中相同的片段也可以被压缩。这是基于delta的VCS做不到的。

相关文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 在本章中,我们将介绍一个分布式版本控制系统的设计思路,以及它与集中式版本控制系统的不同之处。除此之外,我们还...
    香沙小熊阅读 4,338评论 0 9
  • 最近有点忙碌,感觉却是充实无比,除了平时正常工作以外,学习的内容好像也是多。 我就问我自己,时间这是都去哪儿了? ...
    花舍咖啡阅读 3,043评论 0 3
  • 敬爱的牛总,大爱的王总,亲爱的家人们: 大家好!今天是我的日精进第22天,给大家分享我今天的进步和改变,我们...
    木子美丰色阅读 1,852评论 0 0
  • 30s的上海,因为战乱,我和丈夫走散。后来一直和母亲在一家高档饭店里打工,养活自己。不过我一直不是正式的员工,所以...
    莲喵喵阅读 923评论 0 0
  • 今天早上,我给老公说,我月经来了肚子疼,老公说,他要赶到新房子那边处理事,那中午你吃什么,我说想喝粥,我说,我的卫...
    成鹰阅读 1,235评论 0 0