git中的对象blobtreecommitgit中的所有对象保存格式store=type+space+#{content.bytes}+"\0"+contenthashValue=hash(store)hashValue[0,1]文件夹,hashValue[2,-1]用作文件名,即。目录commit:当前根目录加上提交者,提交msg信息git保存格式示例中的所有对象当前根目录:1.txtsrc(目录1.txt中的内容为12)src/1.java,src/2。javablob对象的store=blob+""+2+"\0"+12tree对应的对象是目录,即有2个目录,一个是根目录,一个是src目录。tree的内容格式比blob复杂,是mode+hash+pathmode表示文件的类型,100644是普通文件,100755是可执行文件hash。上面说了,文件就是上面的计算方式,目录就是递归的子目录和子文件。路径:相对路径。如何计算树对应的hash。获取当前所有文件相对于.git根目录的相对路径。即1.txt、src/1.java、src/java都是blob对象。根据blob,先存储hash目录==》文件内容src/1.txtsrc/2.txt拆分"/"成树的内容:100644+""+1.txt就是hash值+1。txt100644+""+2.txt刚才的hash值+2.txt然后store=type+space+#{content.bytes}+"\0"+content,即store=tree+""+"假设上面2行bytes200"+"\0"+hash(store)中的内容选择前2个目录,后面的都是hash文件名=="zlib(store)是src目录的树和有一个git根目录就是1.txt和src。计算方法相同,自下而上。Commit对应的hashcommit对象内容是树的当前根路径的hash+"\n"+"lastcommiterhashvalue"commitername,commiteremail+"\n"+timestamp+blankline+commitmessagegitadd。现在发生了什么路径下的所有子文件(不是文件夹,去掉.git目录和.gitignore意外),对每个文件进行hash,如果不在索引中,生成一个blob类型的文件,记录在索引文件中(有是一个update,其实update只是更新文件路径和hash映射)index文件里面没有文件夹,都是目录。混帐添加。当某文件夹中的1.txt没有文本内容,也没有hash值时,记录分离路径。此处的文章解释了索引的组成部分。gitcommit会发生什么?gitcommt主要生成对应的树对象,从当前.git根目录,每个目录对应一个树对象(这里包含对象持久化)生成commiter对象(这里包含对象持久化)。参考文章git官方文档blob、treecommit和查看对象内容命令说明python写的gitindex组件node.js写的参考git实现思路其他git实现python
