毕业设计团购网站建设,泰安贴吧百度贴吧,想自己做个公司网站不知道怎么做,爱站网挖掘工具这里写自定义目录标题 git 文件存储位置git 数据模型示例分析分析前准备命令哈希值 具体示例 不同版本的提交#xff0c;git 做了什么工作#xff1f;snapshot vs delta-based vs backup参考资料 git 文件存储位置
想要了解如何存储#xff0c;首先需要知道存储位置。 当我… 这里写自定义目录标题 git 文件存储位置git 数据模型示例分析分析前准备命令哈希值 具体示例 不同版本的提交git 做了什么工作snapshot vs delta-based vs backup参考资料 git 文件存储位置
想要了解如何存储首先需要知道存储位置。 当我们通过 git init 创建 git 仓库时会创建.git 目录.git 的目录结构如下
├─hooks
├─info
├─logs
│ └─refs
│ ├─heads
│ └─remotes
│ └─origin
├─objects
│ ├─07
│ ├─13
│ ├─2b
│ ├─2d
│ ├─3b
│ ├─5a
│ ├─5e
│ ├─7e
│ ├─94
│ ├─fa
└─refs├─heads├─remotes│ └─origin└─tags
其中 objects 目录中存储了所有的 git 对象也是直接涉及数据文件存储的目录其他目录在此不做讨论。
那么想要了解 objects 目录中如何存储文件就需要首先了解 git 的数据模型。
git 数据模型
git 数据模型分为三种
blob 对象存储文件数据一个 blob 对象代表一个文件数据tree 对象存储文件和子目录的目录对象commit 对象也即快照包含两个指针分别指向 parent 以及 tree此外还有作者以及提交信息
通过伪代码来认识这三个对象
type blob arraybytetype tree mapstring, tree|filetype commit struct {parent: arraycommitauthor: stringmessage: stringsnapshot: tree
}示例分析
使用我本地的一次提交为例分析一下这三种对象的效果。
分析前准备
命令
分析过程主要使用到两条命令。 git 中提供了 git cat-file 用来查看 git 对象分析时主要使用的参数有 -t 查看对象的类型-p 查看对象的具体内容 git 还有 git log 可以查看提交记录快速找到 commit 对象。
哈希值
git 在存储文件/目录之前会首先根据文件/目录计算 40 位哈希值。其中
前两位为子目录后三十八位为文件名称
git 存储信息时以该哈希值做索引而不是文件名。
哈希值通过 SHA-1 计算得出。
具体示例
首先通过 git log 获取提交历史 可以看到最初的一次提交对应的 commit 对象为 7ea1f87e133d400610a887ad9d9542cb03dc98ad。查看 commit 对象 可以看到 commit 对象中包含了 tree 指针、作者、提交者、提交信息等内容由于第一次提交所以并没有 parent 指针。查看 tree 对象 可以看到该 tree 对象下还有一个 tree 对象以及三个文件 blob 对象。查看 blob 对象 可以看到是一个非常简单的 go 文件。查看第二次提交对象 此处已经有 parent 对象指向了第一次提交 commit 对象。
通过上述过程我们大体可以得出以下结论
commit 对象以链式结构串联代表了不同提交的版本信息commit 对象中保留的 tree 对象包含了当前仓库的全部信息
不同版本的提交git 做了什么工作
以下图为例数据库代表 commit 对象目录代表 tree 对象文件代表blob 对象。该图代表的场景为
第一次提交时commit1 对象指向 tree1 对象tree1 对象中包含了 blob1对象以及 tree1-1对象。第二次提交时仅仅改变了 blob1 所代表的文件内容其余并没改动。
从中可以看到当第二次提交时 commit 对象commit2下创建一个新的 tree 对象tree2。对于第二次提交而言tree1-1并未改动因此 tree2 直接使用指针指向原有地址blob1发生变动则生成一个新的 blob 对象blob2并让 tree2 指向它。
完成上述操作后commit2 对象包含了当前仓库的所有信息这也就是当前时刻的 snapshot。
snapshot vs delta-based vs backup
对三者做一个简易对比。
snapshot 基于快照 每次记录当前时刻仓库状态获取当前版本信息直接获取因为每个版本都拥有整个仓库的所有信息 delta-based 基于差异 每次更新记录该版本和上个版本的差异想获取当前版本信息需要进行差异计算。 backup 备份 最原始的管理方法每做一次改动将代码全量备份到另一个位置找某个版本数据手动查找无法很难得知版本差异。
参考资料
https://cloud.tencent.com/developer/article/1923502git book