git 中的对象
- blob
- tree
- commit
git 中所有对象保存格式
- store = type + 空格 + #{content.字节数}+"\0"+content
- hashValue = hash(store)
- hashValue[0,1] 文件夹, hashValue[2,-1] 作为文件名字 即
.git/objects/[头2个哈希字母]/剩余的哈希值
- 该文件的内容 为 zib 压缩 store的二进制文件
blob 为 文本文件
tree 表示的目录
commit :当前根目录加上 提交人,提交msg 信息
git 中所有对象保存格式举例
当前根目录:1.txt src (目录1.txt 里面的内容为12)src/1.java ,src/2.java
blob 对象的store = blob +" " +2 +"\0"+12
tree 对应的对象就是目录, 即有2个目录, 一个是根目录, 一个是src 目录
tree 的content 格式比blob 复杂
即是 mode + hash + path mode 表示文件的类型,100644 普通文件, 100755 可执行的文件
hash ,提到了过了 ,文件 就是上面的计算方式, 目录 就是递归就子目录,子文件。
path : 相对路径。
如何计算 tree 对应的hash .
获取当前所有文件的相对于 .git 根目录的 相对路径。即是 1.txt ,src/1.java ,src/java
这三者都是 blob 对象。 按照blob 先存储hash目录==》文件内容
src/1.txt src/2.txt split "/" 写进 tree 的content :
100644 +" " +1.txt 刚才的hash值+ 1.txt
100644 +" " +2.txt 刚才的hash值+ 2.txt
然后是
store = type + 空格 + #{content.字节数}+"\0"+content
即 store = tree +" "+" 假定上面2行字节200"+"\0"+content
在 hash (store) 选前2个做目录\后面所有的都是hash做文件名字 ==》zlib(store)
这个是src 目录的tree
还有一个git 根目录 即是 1.txt 和 src . 计算方式一样,置底而上
。
commit对应hash
commit 对像内容为
tree 当前根路径的hash +"\n"
+"上个commiter hash值"
commiter name , commiter email +"\n"+timestamp
+空白行
+commit message
git add . 发生了什么
当前路径下所有子文件,(不是文件夹,除掉.git 目录和.gitignore 意外),对每个文件进行hash , 要是不在index,生成blob类型文件,并记录在 index 文件中(有着更新, 其实更新就更新 文件路径和hash 映射)
index文件里面没有文件夹,都是目录。
git add . 当某个文件夹下1.txt ,没有文本内容, 也没有hash值,记录分隔路径
git commit 发生了什么
git commt 主要是生成 对应的tree 对像,从当前的.git 根目录,每个目录对应一个tree 对象(这里包含了 对象的持久化)
生成 commiter 对象(这里包含了 对象的持久化)。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。