多文件夹提交在Git快照指针结构中是如何表示的?
Git tree对象存储逻辑解答
首先明确结论:你猜想的多文件夹commit结构是完全正确的。
Git tree对象的实际存储规则
- 每个独立目录(包括根目录、所有层级的子目录)都会对应一个独立的tree对象,不会把整个项目的所有目录结构信息合并存储到单个tree文件中。
- 单个tree对象仅存储当前目录层级下的所有条目,每个条目包含三个信息:文件/目录权限位、对象哈希值、文件/目录名,条目分两类:
- 普通文件条目:指向对应文件内容的blob对象哈希
- 子目录条目:指向对应子目录的tree对象哈希
- 这种分层存储的设计也正好适配了Git快照复用的逻辑:如果某个子目录下的所有内容都没有修改,下次提交时根目录的tree可以直接复用该子目录对应的旧tree哈希,不需要重新生成存储。
对应你示例的结构验证
你举的示例完全符合实际实现:
- 地址为
92ec2的根目录tree中,除了3个blob条目(5b1d3、911e7、cba0a)外,确实包含一个指向子目录treeef25b的指针条目 - 地址为
ef25b的子目录tree中,仅存储它自己层级下的2个blob条目(3d4a5、a54fg),不会向上存储父目录的相关信息
你可以在任意有子目录的Git仓库中执行git cat-file -p <tree哈希>命令查看任意tree对象的内容,就能直观看到权限位为040000的子目录tree条目,验证上述逻辑。
内容的提问来源于stack exchange,提问作者Carlos Martins
相关产品推荐
相关产品推荐

