git 中的对象
newer -git 中的对象blobtreecommitgit 中所有对象保存格式store = type + 空格 + #{content.字节数}+"\0"+contenthashValue = 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 对像内容为
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值,记录分隔路径
这边文章里有解释index 的组成部分
git commit 发生了什么git commt 主要是生成 对应的tree 对像,从当前的.git 根目录,每个目录对应一个tree 对象(这里包含了 对象的持久化)
生成 commiter 对象(这里包含了 对象的持久化)。
参考的文章git 官方文档blob, tree commit 的描述 以及查看对象内容命令
python写的git
index 的组成部分
node.js写的git
实现的参考思路
git python的其他实现