Skip to main content

基础用法

1. 正确添加子模块

在主项目 A 中,将项目 B 添加为子模块:

2. 设置子模块的更新策略

确保主项目 A 的 .gitmodules 文件中记录了子模块信息,类似如下:

3. 递归克隆子模块

用户在克隆主项目 A 时,可以直接使用 --recurse-submodules 参数,自动初始化并更新子模块:
注意: 如果用户忘记加 --recurse-submodules 参数,可以手动更新子模块:

4. 让子模块保持与远程同步

默认情况下,子模块会固定在主项目中记录的提交(即哈希值)。为了让子模块(项目 B)同步到其最新的远程提交,可以通过以下方式:
  1. 更新到远程最新提交: 使用以下命令手动同步子模块到最新的远程分支:
  2. 将子模块锁定到最新的远程提交: 如果希望主项目记录最新的子模块提交,执行以下步骤:
    • 进入子模块目录:
    • 返回主项目,提交更新的子模块引用:

5. 配置自动同步子模块

如果希望在克隆主项目时,子模块能自动更新到远程的最新提交,可配置全局或项目级别的 submodule.recurse 选项:
这样,执行 git pullgit clone 时,会递归地拉取和更新子模块。

推荐的工作流

  1. 主项目维护者在子模块有更新时,进入子模块目录拉取更新,并将最新的子模块提交记录到主项目。
  2. 其他开发者在克隆主项目时,执行以下命令确保子模块同步更新:
    或手动初始化:
通过这种方式,可以确保主项目 A 和子项目 B 在协作开发时始终保持一致和同步!

修改.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 和内容:
  1. 更新 URL(如果更改了子模块的 url):
  2. 如果您修改了子模块的路径,需要先移动文件夹:
  3. 然后更新子模块路径并初始化:

4. 检查同步状态

验证 .git/config 是否更新正确:
确保子模块的配置(如路径和 URL)与您的预期一致。

5. 提交更新

将更新后的 .gitmodules 和子模块相关的更改提交到仓库:

完整命令流程

通过这些步骤,您的 .gitmodules 更改就会生效,同时更新子模块的内容和路径。