版本控制系统技术演进史,从SCCS到Git(19)

Git实现了一个staging索引 , 该索引被设计为在提交的中间区域 。 在准备提交新更改时 , 它们的压缩内容在特殊的索引文件中被引用 , 该文件采用树对象的形式 。

树对象是另一种Git对象 , 对应于文件目录 , 它将blob对象连接到它们的真实文件名 , 文件许可权和到其他树的链接 , 并以此方式表示特定文件和目录集的状态 。 一旦所有相关更改都准备好提交 , 索引树就可以提交到存储库 , 该存储库在Git对象数据库中创建一个commit对象 。

commit对象保存特定修订的标题树以及提交作者 , 电子邮件地址 , 日期和描述性提交消息 。 每个commit对象还保存对其父提交的引用 , 因此随着时间的推移 , 将建立项目开发的历史记录 。

如前所述 , 所有Git对象(Blob , tree和commit)都根据其哈希值进行压缩 , 哈希处理并存储在对象数据库中 。 这些被称为松散对象 。 Git实现中没有通过差异来节省空间 , 而都是全部内容哈希键索引和压缩镜像 , 所以 , Git非常快 , 因为每个文件修订版的全部内容都可以作为一个松散的对象来访问 。 但是 , 某些操作(例如 , 将提交推送到远程存储库 , 存储太多对象或手动运行Git的垃圾收集命令)可能会导致Git将对象重新打包为打包文件 , 在打包过程中 , 采用反向差异并进行压缩以消除多余的内容并减小尺寸 。 该过程将生成包含对象内容的.pack文件 , 每个文件都有一个对应的.idx索引文件 , 其中包含对打包对象及其在打包文件中位置的引用 。

推荐阅读