1.11. 保存索引到对象数据库

未匹配的标注

索引具体是指哪个文件?

.git/index

在上一节添加索引的操作时,在 .git 目录中变化的文件如下:

➜  plumbing-demo git:(main) ✗ ll -t .git/
total 40
-rw-r--r--   1 administrator  staff   1.4K Sep 23 12:55 index
drwxr-xr-x  82 administrator  staff   2.6K Sep 23 12:55 objects

进入 objects 目录,可以看到有两个新生成的文件夹,里面的文件就是我们上面添加到索引的两个文件:

drwxr-xr-x  3 administrator  staff    96B Sep 23 12:55 64
drwxr-xr-x  3 administrator  staff    96B Sep 23 12:55 66
➜  plumbing-demo git:(main) ✗ ll .git/objects/64
total 8
-r--r--r--  1 administrator  staff   290B Sep 23 12:56 887ccefbf12890e4a1fa91808108e1fff6237b

➜  plumbing-demo git:(main) ✗ ll .git/objects/66
total 8
-r--r--r--  1 administrator  staff   495B Sep 23 16:31 b69fbac2f614594a58cc9a7cc8ddedcee95769

存储原理

创建 tree 对象

前面我们已经知道了,每一个 commit 都对应一个 tree,这个 tree 它就代表了这一个 commit 的快照。所以在创建一个 commit 的对象之前,我们需要用 git write-tree 这个命令 将我们的 index 也就是 暂存 tree 添加到 git 的 object database

➜  plumbing-demo git:(main) ✗ git write-tree
2d65f16fe7d8345a6753be90410ca511d040e16f

这个命令会从 index 创建一个 tree 对象并存放到 .git/objects 这个文件夹里面,同时在命令行输出它的校验和。

这里我们可以看到在 .git 这个文件夹下面,index已被修改,同时他在 object 这个文件夹下面生成了一个新的文件,以 2d 作为子文件夹名,我们进入这个2d。

➜  plumbing-demo git:(main) ✗ ll -t .git/
total 40
-rw-r--r--   1 administrator  staff   1.4K Sep 23 16:47 index
drwxr-xr-x  82 administrator  staff   2.6K Sep 23 16:22 objects
drwxr-xr-x   4 administrator  staff   128B Sep 22 09:24 info
drwxr-xr-x   4 administrator  staff   128B Sep 22 09:24 logs
-rw-r--r--   1 administrator  staff   299B Sep 22 09:24 packed-refs
-rw-r--r--   1 administrator  staff    21B Sep 21 20:42 HEAD
-rw-r--r--   1 administrator  staff   189B Sep 21 16:44 config
drwxr-xr-x   5 administrator  staff   160B Sep 21 15:10 refs
drwxr-xr-x  15 administrator  staff   480B Sep 21 15:10 hooks
-rw-r--r--   1 administrator  staff    73B Sep 21 15:10 description
➜  plumbing-demo git:(main) ✗ ll -t .git/objects
total 0
drwxr-xr-x  5 administrator  staff   160B Sep 23 16:47 2d

这个时候我们可以看到里面有三个文件,最近的时间的就是我们新生成的这个 tree 对象的文件。

➜  plumbing-demo git:(main) ✗ cd .git/objects/2d
➜  2d git:(main) ll
total 24
-r--r--r--  2 administrator  staff   209B Sep 20 20:22 0bdc86e5a64898b75755f332426c6dd1a7b4fa
-r--r--r--  2 administrator  staff   175B Sep 20 20:22 1d0b8c0b480bf81a5fb40fecd5fedc486c5e3f
-r--r--r--  1 administrator  staff   470B Sep 23 16:47 65f16fe7d8345a6753be90410ca511d040e16f

然后我们看一下这两个是不是她们的校验和是不是一致的。我们 git write-tree 输出的校验和也是 2d 开头。然后65f16,我们下面这个也是 65f16 说明两个吻合,那这个就是我们生成的这个 tree 对象。

接下来我们就可以用 git ls-tree 来查看我们这个新的快照。

➜  2d git:(main) git ls-tree 2d65f16
100644 blob 8b3b8411eb86258efd4fe44ca0e6b3e428aa9be6    .gitignore
040000 tree f91ea5cbaa3c1c30c226f2a1482cbd63518daf76    about
100644 blob cf7bb0e4e09d657a84fb0abb2b2bca434860df1c    blue.html
100644 blob 822e2cb2140bba69f4bd72fac43941360f5564f6    green.html
100644 blob 66b69fbac2f614594a58cc9a7cc8ddedcee95769    index.html
100644 blob d85d6f3da33555e10584e172ae65dae1f92db68f    news-1.html
100644 blob 42f208c97da2ac5ce2e3d952c41aa90b96026273    news-2.html
100644 blob 644acb81b164fe4a8a73910d6933318c8ff96e5c    news-3.html
100644 blob 64887ccefbf12890e4a1fa91808108e1fff6237b    news-4.html
100644 blob 9bbddb486e8dc04166fad51c3bf523a3d6114df3    orange.html
100644 blob 835b166283ef6b88dddbe92a581dcd541bacbb4f    pink.html
100644 blob 290aa9d00d3e30847dee0f3b90042d1f9a0721a1    rainbow.html
100644 blob 70ce141cd1e36585441e1f8e2879f7ade6fa87fa    red.html
100644 blob cb6e3353a97fa8fa316616ba492dd4c5ca853d9f    style.css
100644 blob e9d1781fd949fd41d2439ae3824a293531bc38a5    yellow.html

这个时候我们就可以看出这个快照中包含的所有文件。

注意事项

对于这个 commit 和这个 tree 来说,新创建的 blob 只有 index.htmlnews-4.html,剩下的文件全部是对已有 blob 的引用。

我们可以对一下他们的校验和,会发现完全一致。

现在我们就有了自己的 tree 对象,但是我们还没有把它添加到我们的项目历史当中。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~