我们先找到git代码,然后找到git第一版的代码。
https://github.com/git/git/commit/e83c5163316f89bfbde7d9ab23ca2e25604af290
也就是这个,git clone下来。
我们看到第一次提交的文件比较少。
通过make可以生成7个可执行文件,也正说明了初代的git只实现了以下几个功能。
要研究,我们先研究以下他们怎么用。
功能:
1.使用init-db初始化工作目录
2.增加自己写的文件
3.使用./update-cache test.c保存更改至缓存中。这会生成一个index文件,改文件用于保存当前的cache。但是屏幕不会显示。
4.使用write-tree提交缓存中的更改。这会生成一个tree文件,当前的cache中的文件会写入到tree文件中去。命令结果会返回tree文件的sha1值。
5.show-diff,用来比较当前工作目录下的文件和cache中记录的文件的区别。
6.cat-file<SHA1>,查看某个文件。会生成一个TEMP文件用来保存SHA1文件中的内容。
这里发现temp文件后tree
数据结构:
GIT 核心数据结构有五个: object, blob, tree, commit,cache_entry。其中
- object: 基类。
- blob: 对应于一个文件。
- tree: 对应于一个目录。 一个 tree 包含一个或多个 blob 和 tree。
- commit: 对应于一个版本。 一个 commit 对象指向一个 tree 对象,该tree 对象对应于该版本的根目录。 一个 commit 对象指向一个父 commit 对象, 表示它是该父commit 的下一个版本,或指向多个父commit 对象,表示它由这些父 commit 合并得到。
代码:
init-db:使用init-db初始化工作目录,类似于git init的作用。
memcpy(path, sha1_dir, len);
for (i = 0; i < 256; i++) {
sprintf(path+len, "/%02x", i);
if (mkdir(path, 0700) < 0) {
if (errno != EEXIST) {
perror(path);
exit(1);
}
}
}
建立一个文件.dircache,此文件下有255个文件夹。
i循环255次,将i以16进制格式作为文件夹名。
然后创建文件夹。
会得到如下的文件
这些文件都是空的
这些文件使用来存储SHA1值的。