You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多文件夹提交在Git快照指针结构中是如何表示的?

Git tree对象存储逻辑解答

首先明确结论:你猜想的多文件夹commit结构是完全正确的。

Git tree对象的实际存储规则

  • 每个独立目录(包括根目录、所有层级的子目录)都会对应一个独立的tree对象,不会把整个项目的所有目录结构信息合并存储到单个tree文件中。
  • 单个tree对象仅存储当前目录层级下的所有条目,每个条目包含三个信息:文件/目录权限位、对象哈希值、文件/目录名,条目分两类:
    1. 普通文件条目:指向对应文件内容的blob对象哈希
    2. 子目录条目:指向对应子目录的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 22:24:06