为何`git submodule add`将Git信息存储于父仓库.git中?如何规避?
Git子模块存储逻辑与独立目录配置
为什么子模块会关联存储在父仓库?
- Git子模块的设计初衷是让父仓库能追踪外部依赖仓库的特定版本,默认情况下,Git会把子模块的版本数据(提交对象、分支信息等)集中存放在父仓库的
.git/modules目录下,这是一种空间优化策略——避免每个子模块都重复存储完整的Git对象库。 - 子模块目录下的
.git是一个文本文件而非文件夹,它本质是一个路径链接,指向父仓库.git/modules里对应子模块的存储位置,告诉Git从哪里读取该子模块的版本信息。
如何配置子模块拥有独立的.git文件夹?
方法1:添加子模块时直接指定独立Git目录
使用--separate-git-dir参数,在添加子模块时就指定其.git文件夹的位置,示例命令:
git submodule add --separate-git-dir ./my-submodule/.git https://github.com/example/repo.git ./my-submodule
执行后,my-submodule目录下会生成独立的.git文件夹,子模块的版本数据会直接存在这个目录里,和你期望的结构一致。
方法2:迁移已添加的子模块
如果已经完成子模块添加,可按以下步骤调整:
- 进入子模块目录:
cd ./my-submodule - 将父仓库中该子模块的Git数据移动到子模块目录下:
mv ../../.git/modules/my-submodule .git - 编辑子模块的
.git/config文件,修正core.worktree路径为相对子模块.git的工作目录路径(比如设置为../) - 返回父仓库,修改
.gitmodules文件,删除对应子模块的gitdir配置项,然后执行同步:git submodule sync
内容的提问来源于stack exchange,提问作者adelriosantiago
相关产品推荐
相关产品推荐

