如何设置一个 Git 项目来使用外部存储库子模块?

227

我想创建一个可以拉取远程仓库的存储库。

例如,让我们以 jQuery 作为子模块:

git://github.com/jquery/jquery.git

如何创建一个包含jQuery子模块,并将自己的外部存储库添加为远程存储库的过程是什么?

一旦设置完成后,如果我推送/拉取到自己的远程存储库,外部存储库是否会保持不变?


1
当你说“pull in”时,你是说想让jQuery存储库成为你自己的存储库的子模块吗? - ezod
是的,完全正确。如果不清楚,对不起。我想知道如何将此设置为外部,同时推送和拉取更改到自己的远程。 - Tom
请查看git wiki上的Git子模块教程 - Greg Bacon
4个回答

364
  1. 您有一个名为MyWebApp的项目,它已经有了一个GitHub仓库。
  2. 您想在您的项目中使用jQuery仓库
  3. 您想将jQuery仓库作为子模块拉入您的项目。

子模块非常容易引用和使用。假设您已经设置了MyWebApp作为仓库,请从终端发出以下命令:

cd MyWebApp
git submodule add git://github.com/jquery/jquery.git externals/jquery

这将创建一个名为externals/jquery*的目录,并将其链接到github jquery存储库。现在我们只需要初始化子模块并将代码克隆到其中:


git submodule update --init --recursive

现在你应该已经将所有最新的代码克隆到子模块中了。如果jquery仓库发生更改,您想要拉取最新的代码,只需再次执行submodule update命令即可。请注意:我通常在我的项目中有许多外部仓库,因此我总是将这些仓库分组放置在一个名为“externals”的目录下。

在线的Pro Git Book提供了一些关于子模块(以及git)的好信息,以易于阅读的方式呈现。另外,git help submodule也会提供很好的信息。或者可以看一下git wiki上的Git Submodule Tutorial

我注意到这篇博客文章谈到了子模块,并将它们与Subversion的svn:externals机制进行了比较:http://speirs.org/blog/2009/5/11/understanding-git-submodules.html

* 作为最佳实践,您应该始终将子模块放置在它们自己的目录中,例如Externals。如果不这样做,您的根项目目录可能会非常混乱。


4
很好的解释! :) 此外,如果您想了解更多细节、内部信息等,"git help submodules" 可以提供一些帮助。 - WhyNotHugo
1
@Chevi 这取决于您的要求。一般来说,将 git 项目作为子模块添加到您的项目中是一个良好的解决方案,适用于经常更改或仍处于开发阶段的项目。这使您能够轻松确保项目中所有第三方代码都是最新的。对于实质上是静态的第三方代码 -- 稳定、成熟的代码,可能从版本到版本不会有太大变化 -- 使用子模块并没有提供太多价值。 - memmons
2
抱歉,与 SVN 外部依赖相比,这并不那么容易。 - Keil
2
@Keil 这是两个命令,git submodule addgit submodule update... 我不确定会有多简单。 - memmons
1
@MichaelG.Emmons 这是如何操作的:当你使用Subversion更新时,你甚至不需要运行第二个命令,只需在主项目上执行“svn update”,所有外部依赖都会自动更新。 - Hakanai
显示剩余5条评论

28

大部分你需要知道的内容已经得到回答,所以我不会去讨论那些问题。但是,我发现有个小问题通常被忽略了。

正如你所知,“git pull”不会更新子模块,“git submodules update”也不会下载这些子模块的最新HEAD。

要将所有子模块更新为其最新的上游修订版本,可以使用:

git submodule foreach git pull

如果你经常更改子模块,并且有很多子模块,那么"git foreach"将变得非常有价值。


3

1

我认为@Hugo的回答可能是您需要的,并且很好用。所以我找到了一种更简单的方法。

git submodule update --remote

这就是全部。

因此,完整的工作流程可能是:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote

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