想晋级高级工程师只知道表面是不够的!Git内部原理介绍 (2)

d670460b4b4aece5915caf5c68d12f560a9fe3e4

-w 执行写入数据库操作,若不指定该选项,只会返回hash,不会写入数据库。 --stdin 标准输入输出读取 默认存入是blob类型,通过-t 参数指定

$ find .git/objects/ -type f .git/objects//d6/870460b4b4aece5915caf5c68d12f560a9fe3e4

一个文件对应一条内容,这个内容的名称以该文件内容加上特定头部信息一起的sha-1校验和。

头部信息-对象类型(blob或tree或commit)+一个空格+数据内容长度+一个空字节 git 会通过zlib将文件内容和头部信息拼接一起的内容进行压缩写入磁盘某个对象,并用计算出的sha-1值的前两个字符串作为目录名称,后38个字符串作为子目录内文件的名称。

$ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4

test content

4.2 简单版本控制演示 4.2.1 创建初始版本

$ echo ‘version 1’ > test.txt

$ git hash-object -w ./test.txt 83baae61804e65cc73a7201a7252750c76066a30

4.2.2 更新版本

$ echo ‘version 2’ > test.txt

$ git hash-object -w ./test.txt 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a

此时数据库已经存储了test.txt两个不同的版本,如下:

$ find .git/objects/ -type f .git/objects//1f/7a7a472abf3dd9643fd615f6da379c4acb3e3a .git/objects//83/baae61804e65cc73a7201a7252750c76066a30

可以通过cat-file -p查看内容,以上都是数据(blob)对象。可以使用 cat-file -t查看。

4.3 树对象引入

树对像(tree object) 解决文件名和目录保存问题。一个树对象包含了一条或多条树对象记录,每条记录包含一个指向数据对象或子树对象的sha-1指针,以及相应的模式/类型/文件信息。

如下所示:

img

$ git cat-file -p master^{tree}

100644 blob a906cb2a4a904a152e80877d4088654daad0c859 README 100644 blob 8f94139338f9404f26296befa88755fc2598c289 Rakefile 040000 tree 99f1a6d12cb4b6f19c8655fca46c3ecf317074e0 lib

$ git cat-file -p 99f1a6d12cb4b6f19c8655fca46c3ecf317074e0 100644 blob 47c6340d6459e05787f644c2447d2595f5d3a54b simplegit.rb

master^{tree}指向master分支最新提交所指的树对象。 数据对象几种类型

100644: 表示一般文件

100755: 表示可执行文件

120000: 表示 指针

—add: 将未跟踪文件加入缓存区

—cacheinfo 将数据对象文件加入工作区

4.3.1 将文件加入暂存区

$ git update-index —add —cacheinfo 100644 83baae61804e65cc73a7201a7252750c76066a30 test.txt

4.3.2 生成树对象

创建第一个树 $ git write-tree 将暂存区内容生成一个树对象,并输出树对象SHA-1 d8329fc1cc938780ffdd9f94e0d364e0ea74f579

4.3.3 演变一个复杂的树

$ echo ‘new file’ > new.txt

$echo ‘test file2’ > test.txt

$git update-index —cacheinfo 100644 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a test.txt

$ git update-index test.txt

$ git update-index —add new.txt

创建第二个树

$ git write-tree 0155eb4229851634a0f03eb265b69f5a2d56f341

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyggx.html