10

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

我怎样才能安全地设置它?在建立之后,以后有什么特殊的合并流程吗?

4

1 回答 1

10

子模块是完成此任务的最简单方法。

使用子模块有两种常见的方法——添加新的和初始化现有的。

添加新的子模块

从本地存储库的根目录运行:

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 版本)中找到。

于 2011-02-10T20:03:28.507 回答