git 中的对象

  1. blob
  2. tree
  3. commit

git 中所有对象保留格局

  1. store = type + 空格 + #{content.字节数}+"\0"+content
  2. hashValue = hash(store)
  3. hashValue[0,1] 文件夹, hashValue[2,-1] 作为文件名字 即 .git/objects/[头2个哈希字母]/残余的哈希值
  4. 该文件的内容 为 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的其余实现