git源码剖析-init-db

我们先找到git代码,然后找到git第一版的代码。

https://github.com/git/git/commit/e83c5163316f89bfbde7d9ab23ca2e25604af290

也就是这个,git clone下来。

我们看到第一次提交的文件比较少。

git源码剖析-init-db_第1张图片

通过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,查看某个文件。会生成一个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进制格式作为文件夹名。

然后创建文件夹。

会得到如下的文件

git源码剖析-init-db_第2张图片这些文件都是空的

git源码剖析-init-db_第3张图片

这些文件使用来存储SHA1值的。

你可能感兴趣的:(Git)