使用子模块是实现此目的最简单的方法。
有两种常见的处理子模块的方式 - 添加新的子模块和初始化现有的子模块。
添加新的子模块
从本地仓库的根目录运行以下命令:
git submodule add <repository> external/engage.iphone
.
当你初始添加子模块到仓库时,使用add
命令,而不是在已克隆带有现有子模块的仓库。它会将另一个存储库添加到.gitmodules文件中,该存储库可以位于本地或远程路径(如果你发布仓库,则其他开发人员需要访问该存储库!),然后将存储库克隆到指定位置;如上面的例子:external/engage.iphone
。此时,你的系统上有子仓库文件,并且在.gitmodules文件和本地仓库配置中都列出了它作为子模块。
但是,你可能并没有自己添加子模块...
初始化现有子模块
如果你正在克隆已添加了子模块的仓库,则情况会有所变化。在这种情况下,.gitmodules文件将列出子模块及其位置,但是本地仓库配置并不知道这些子模块,实际文件也不存在于你的系统中。首先需要初始化子模块:
git submodule init
这将遍历.gitmodules中列出的任何存储库,并将它们添加到你的.git/config中。现在GIT已经了解了该存储库,但它尚未克隆该存储库,因此运行以下命令:
git submodule update
随时可以运行此命令以更新已注册的子模块,例如clone丢失的子模块。
git submodule sync <submodule>
除非你在执行子模块添加时指定了特定的提交,否则运行此命令可将所有子模块更新为其远程HEAD!指定特定的子模块将只同步该子模块。
按照 Git 的传统做法,init
命令可以与 update
命令结合使用以节省时间:
git submodule update --init
。
当然,一旦掌握了它们所使用的布局(类似于配置文件中的分支和远程部分),您也可以随时手动更新您的 .gitmodules 和 .git/config 文件。
所有具体内容可在 man 页面(kernel.org 版本)中找到。
git submodule update --init --recursive
来更新它们。看起来你在父存储库中的第二个子模块也可能是多余的,因为它已经包含在engage.iphone中了。希望这可以帮助到你! - ghickman