我正在试图找出克隆第三方库(来自Janrain的engage.iphone)到我自己的应用程序目录结构的正确方法,这种方式可以让我提取最新的更改并将它们与任何更改合并我在当地制作。我还希望将第三方库(与我的更改合并)包含在我推送它的git仓库中。
结构将是这样的:
myApp/ <- this is my app, which is its own git repo
external/
engage.iphone/ <- this is the 3rd party library I want to keep up-to-date
mySource1.h
mySource2.m
...
如何安全地以这种方式进行设置?在它成立之后,是否有任何特殊的流程可以在以后合并?
答案 0 :(得分:9)
子模块是实现此目的的最简单方法。
使用子模块有两种常用方法 - 添加新模块并初始化现有模块。
添加新子模块
从本地存储库的根目录运行:
git submodule add <repository> external/engage.iphone
。
add
命令适用于最初向存储库添加子模块的情况,而不是在您使用现有子模块克隆存储库时。它添加了另一个存储库,它可以位于本地或远程路径上(请记住,如果您将存储库发布,其他开发人员需要访问它!)到存储库根目录中的.gitmodules文件,然后将存储库克隆到您指定的位置;上例中的external/engage.iphone
。在此阶段,您的系统上有子存储库文件,它在.gitmodules文件和本地存储库的配置中列为子模块。
但是你可能不会自己添加子模块......
初始化现有子模块
如果您正在克隆已经添加了子模块的存储库,那么事情会有所改变。在这种情况下,.gitmodules文件将在其中列出子模块以及从中检索它们的位置,但是您的本地存储库配置对它们一无所知,并且系统上尚不存在实际文件。首先,您需要初始化子模块:
git submodule init
这将运行.gitmodules中列出的任何存储库,并将它们添加到.git / config。 Git现在知道了存储库,但它实际上还没有克隆它,所以运行:
git submodule update
您可以随时运行此命令来更新已注册的子模块,即克隆丢失的子模块。
git submodule sync <submodule>
运行此命令将所有子模块更新到其远程HEAD,除非您在执行子模块添加时指定了特定的提交!指定特定的子模块只会同步该子模块。
以真正的git方式,init
命令可以与update
组合以节省时间:
git submodule update --init
。
当然,一旦你学会了他们使用的布局(类似于配置中的分支和远程部分),你总是可以手动更新.gitmodules和.git / config。
所有细节都可以在手册页(kernel.org version)中找到。