absorbgitdirs 是什么
git submodule absorbgitdirs 把子模块目录内的 .git(文件或目录)迁移进父仓库的 .git/modules 统一管理:子模块目录恢复干净,元数据集中收纳,便于统一备份与迁移。新版 Git 添加子模块时默认就采用这种布局;从旧版本迁移来的仓库或手工创建过子模块的仓库,才需要手工执行。收纳只挪元数据,不动子模块内容与提交。
基本信息
| 用途 | 把子模块的 git 元数据收纳到父仓库 .git/modules |
|---|---|
| 执行 | git submodule absorbgitdirs [<路径>] |
| 结果 | 子模块目录里只留指向父仓库的 .git 引用文件 |
| 背景 | 新版 Git 添加子模块时默认已这样处理 |
| 范围 | 不带路径时处理全部子模块 |
| 影响 | 不改变子模块内容与提交记录 |
典型使用场景
- 老仓库整理:从旧版 Git 迁移来的仓库统一元数据布局
- 手工子模块:早期手工克隆出的子模块目录需要收纳
- 备份简化:元数据集中后,备份父仓库时一并覆盖
- 迁移准备:整仓搬迁前确认布局符合新习惯
- 排错对照:子模块 .git 形态混乱时先统一再排查
- 批量治理:多子模块仓库执行后逐个核对状态
常用示例
常用示例
git submodule absorbgitdirs # 收纳全部子模块的元数据
git submodule status # 核对子模块状态(哈希与路径)
ls -a vendor/common | head # 子模块目录里只剩 .git 引用文件收纳前后对比
| 项目 | 收纳前 | 收纳后 |
|---|---|---|
| 子模块 .git | 独立目录或文件,形态不一 | 统一为指向 .git/modules 的引用 |
| 元数据位置 | 散在子模块目录内 | 集中在父仓库 .git/modules |
| 内容与提交 | 不变 | 不变 |
| 日常操作 | update / commit 照常 | update / commit 照常 |
从旧版本 Git 迁移的仓库或手工创建过子模块时常用;收纳后子模块目录里只留一个 .git 引用文件。
收纳不改变工作区文件,但迁移场景仍要核对 update 能正常拉取,再继续后续操作。
多工作区(worktree)与嵌套子模块场景的路径依赖更复杂,先在小规模仓库验证再批量执行。