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

11

我正在尝试找出将第三方库(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
    ...

如何安全地设置这种方式?在设置完成后,是否有任何特殊的合并过程?

1个回答

13

使用子模块是实现此目的最简单的方法。

有两种常见的处理子模块的方式 - 添加新的子模块和初始化现有的子模块。

添加新的子模块

从本地仓库的根目录运行以下命令:

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


谢谢。我现在遇到了这个错误:“.gitmodules中没有子模块映射路径'engage.iphone/Contrib/json-framework'”...有什么想法吗? - Steve N
当我运行 "git submodule init" 时会发生这种情况。 - Steve N
@SteveN 你是怎么运行add命令的?它在你的.gitmodules文件中添加了什么? - ghickman
我不记得具体的“add”命令,但我肯定尽可能地与您的建议相似。以下是.gitmodules中的内容:[子模块“external/janrain/engage.iphone”] 路径=外部/janrain/engage.iphone URL=https://github.com/janrain/engage.iphone.git [子模块“External/JSON”] 路径=External/JSON URL=git://github.com/stig/json-framework.git - Steve N
@SteveN engage.iphone存储库中没有.gitmodules文件,因此git不知道从哪里获取其中包含的子模块。 - ghickman
@SteveN 没意识到只能在5分钟内编辑评论...从上面继续 - 在external/engage.iphone中添加.gitmodules,这是我用来让它工作的:https://gist.github.com/845109 然后运行 git submodule update --init --recursive 来更新它们。看起来你在父存储库中的第二个子模块也可能是多余的,因为它已经包含在engage.iphone中了。希望这可以帮助到你! - ghickman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接