git 中的对象

newer -
git 中的对象
git 中的对象

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对应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值,记录分隔路径

这边文章里有解释index 的组成部分

git commit 发生了什么

git commt 主要是生成 对应的tree 对像,从当前的.git 根目录,每个目录对应一个tree 对象(这里包含了 对象的持久化)

生成 commiter 对象(这里包含了 对象的持久化)。

参考的文章

git 官方文档blob, tree commit 的描述 以及查看对象内容命令

python写的git

index 的组成部分

node.js写的git

实现的参考思路

git python的其他实现

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

Tags 标签

gitgithubjava

扩展阅读

加个好友,技术交流

1628738909466805.jpg