1,plumbing
2,.git目录结构
– 一般
description 一般都是描述,不是很重要
config git项目的所有配置项
info 包含了我们不需要git追踪的排除掉的文件(exclude)
hooks 钩子,配合自动部署/自动构建
– 重要
head 指向了我们当前所处的分支指针
index 存储了暂存区的内容
objects 存储了git中所有的数据
refs 存储了所有的指针(包括branch、tag、remote)
3,底层命令
(1)git hash-object #接受一个value,然后返回SHA-1 hash值(40位)
例如:
echo ‘hello’ | git hash-object -w --stdin
如果不加–stdin的话,就要加上一个文件名
(2)git存储机制:
40位hash值,前2位作为文件夹名称,后38位作为文件名
(3)git cat-file #查看存储到git中的文件内容
例如:
git cat-file -p 38位hash值 #查看存储文件内容
git cat-file -t 38位hash值 #查看存储文件类型,blob类型
git cat-file -p master^{tree}
(4)find .git/objects -type f #查看.git/object中的所有文件
(5) git update-index --add --cacheinfo 100644 40位hash值 文件名
例如:
git update-index --add --cacheinfo 100644 83bddddd… test.txt
解释:
git update-index #将数据库中存储的某个blob数据的引用放到暂存区中
–add #因为暂存区中没有这个文件
–cacheinfo #不是从工作区中加入文件,是从git仓库(git数据库)加入文件
100644 #表示这是一个普通的文件
(6)git write-tree
创建一个tree object,将数据库内容的引用放入到暂存区
相当于基于暂存区中当前所有文件的版本(引用),创建一个快照
(7)git commit-tree
会生成一个commit object
commit object 包含:tree object、作者、提交人、备注等信息
可以理解为tree object就是项目当前的一个完整快照
(8)总结:
git add --add . === git update-index
git commit === git write-tree && git commit-tree