基础用法
1. 正确添加子模块
在主项目 A 中,将项目 B 添加为子模块:2. 设置子模块的更新策略
确保主项目 A 的.gitmodules 文件中记录了子模块信息,类似如下:
3. 递归克隆子模块
用户在克隆主项目 A 时,可以直接使用--recurse-submodules 参数,自动初始化并更新子模块:
注意: 如果用户忘记加 --recurse-submodules 参数,可以手动更新子模块:
4. 让子模块保持与远程同步
默认情况下,子模块会固定在主项目中记录的提交(即哈希值)。为了让子模块(项目 B)同步到其最新的远程提交,可以通过以下方式:-
更新到远程最新提交:
使用以下命令手动同步子模块到最新的远程分支:
-
将子模块锁定到最新的远程提交:
如果希望主项目记录最新的子模块提交,执行以下步骤:
- 进入子模块目录:
- 返回主项目,提交更新的子模块引用:
- 进入子模块目录:
5. 配置自动同步子模块
如果希望在克隆主项目时,子模块能自动更新到远程的最新提交,可配置全局或项目级别的submodule.recurse 选项:
git pull 或 git clone 时,会递归地拉取和更新子模块。
推荐的工作流
- 主项目维护者在子模块有更新时,进入子模块目录拉取更新,并将最新的子模块提交记录到主项目。
- 其他开发者在克隆主项目时,执行以下命令确保子模块同步更新:
或手动初始化:
修改.gitmodules配置
在修改.gitmodules 文件后,您需要让更改重新生效。这通常涉及更新 Git 子模块的配置和内容。以下是操作步骤:
1. 修改 .gitmodules
假设您已经编辑了 .gitmodules 文件,例如更改了子模块的路径或 URL。
.gitmodules 示例:
2. 运行 git submodule sync
git submodule sync 用于同步 .gitmodules 中的更改到 Git 的内部配置(.git/config)。
- 如果有多个子模块,
git submodule sync会同步所有子模块。 - 如果只想同步特定子模块,可以指定路径:
3. 更新子模块 URL 或内容
运行以下命令以更新子模块的 URL 和内容:-
更新 URL(如果更改了子模块的
url): -
如果您修改了子模块的路径,需要先移动文件夹:
-
然后更新子模块路径并初始化:
4. 检查同步状态
验证.git/config 是否更新正确:
5. 提交更新
将更新后的.gitmodules 和子模块相关的更改提交到仓库:
完整命令流程
.gitmodules 更改就会生效,同时更新子模块的内容和路径。