git存储内容的位置和方式

2020-01-20 git

Git是一个工具,只要熟练掌握它的操作就能完成工作中的绝大多数任务。

我们很少会考虑Git历史提交数据存储在哪,又以何种方式存储,下面对此进行一下介绍。

首先看一段代码实例:

1
2
3
4
5
6
7
8
let obj = {
  webName: "蚂蚁部落",
  address: "青岛市南区"
}
obj.age = 4;
console.log(obj.webName);
console.log(obj.address);
console.log(obj.age);

上面是一个对象直接量简单演示,对象直接量以键/值对方式存储数据,通过键可以获取对应的值。

本质上Git存储数据的方式也是如此,键就是数据内容sha-1值,值自然是对象内容。

在E盘git目录下初始化一个全新的仓库,代码如下:

1
$ cd /e/git

切换到git目录。

1
$ git init

初始化一个全新的仓库,git目录下除了.git目录(默认隐藏)外别无它物。

.git目录中的objects子目录就是用来存储数据的,截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003002k8zwni7088z8cwn4.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

其中两个子目录是系统自动创建的,可以看到当前并没有存储任何数据。

下面开始向里面存储数据,代码如下:

1
$ echo "蚂蚁部落" | git hash-object -w --stdin

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003047a1l42a2p4znd7js2.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

解析如下:

(1)."蚂蚁部落"是要存储的内容。

(2).git hash-object命令用来存储数据对象。

(3).-w表示不仅计算出内容的sha-1值,而且会将数据存储,否则只会给出sha-1值。

(4).--stdin表示内容是通过标准输入设备获取的,比如我通过键盘输入。

(5).第二行是存储内容的sha-1值。

现在再来看一下.git/objects目录中的内容,截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003109p7q79cqf7deimfgq.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

多出了一个子目录,名字是21,它的内容是:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003131s8x7bp8f47p7n44p.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

21子目录中有一个文件,名为0a3e5558a2c25c0a577a3f2555c2f82e5529c6。

内容存储位置总结如下:

(1).存储于.git/objects目录中。

(2).以sha-1值的前两位作为子目录名称,存储内容的文件名字为sha-1值的后38位。

现在我们打开存储内容的文件,截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003204s9e94s4idtdwehxp.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

存储的并不是原始数据“蚂蚁部落”,而是通过zlib压缩的内容。

下面根据sha-1值这个键来查看对应的值(也就是存储的数据):

1
$ git cat-file -p 210a3e5558a2c25c0a577a3f2555c2f82e5529c6

代码运行截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003243rbpoc9kjubbi7k9b.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

下一篇:没有了