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指针,以及相应的模式/类型/文件信息。
如下所示:
$ 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