Git:如何将第三方库克隆到我应用程序库的子目录中?

Ste*_*e N 9 git git-clone

我正在试图找出克隆第三方库(来自Janrain的engage.iphone)到我自己的应用程序目录结构的正确方法,这种方式可以让我提取最新的更改并将它们与我在本地进行的任何更改合并.我还希望第三方库(与我的更改合并)在我推送它时包含在我自己的应用程序的git repo中.

结构将是这样的:

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
    ...
Run Code Online (Sandbox Code Playgroud)

如何安全地以这种方式设置它?在它成立之后,是否有任何特殊的流程可以在以后合并?

ghi*_*man 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>

运行此命令将所有子模块更新到其远程H​​EAD,除非您在执行子模块添加时指定了特定的提交!指定特定的子模块只会同步该子模块.

在真正的git方式中,init命令可以与update节省时间相结合:

git submodule update --init.

当然,一旦你学会了他们使用的布局(类似于配置中的分支和远程部分),你总是可以手动更新.gitmodules和.git/config.

所有细节都可以在手册页(kernel.org版本)中找到.