如何设置一个git项目以使用外部repo子模块?


213

我想创建一个回购远程回购的回购。

例如,假设jQuery作为子模块:

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

用jQuery作为子模块创建存储库并添加我自己的外部设备作为远程存储库的过程是什么?

同样,一旦设置完成,如果我推/拉到自己的遥控器,外部设备是否会完好无损?


1
当您说“拉入”时,您是说要让jQuery存储库成为您自己存储库的子模块吗?
ezod 2010年

是的,很抱歉,如果不清楚。我想知道我是怎么设置此为外部,同时推动和拉动的改变我自己的遥控器
汤姆

请参阅git Wiki上的Git子模块教程
格雷格·培根

Answers:


343
  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 repo发生更改,并且您想下拉最新的代码,只需submodule update再次发出命令即可。请注意:我的项目中通常有许多外部存储库,因此我总是将存储库分组在“外部”目录下。

在线Pro Git手册中有一些关于子模块(通常是git)的良好信息,以易于阅读的方式呈现。或者,git help submodule也会提供良好的信息。或看看Git子模块教程 git Wiki上的。

我注意到此博客条目讨论了子模块,并将其与Subversion的svn:externals机制进行了比较:http : //speirs.org/blog/2009/5/11/understanding-git-submodules.html

*作为最佳实践,您应该始终将子模块放在其自己的目录中,例如“外部”。否则,您的根项目目录可能会变得非常混乱。


4
很好的解释!:)另外,“混帐帮助子模块”帮助,如果你想要更多的细节,内部等
WhyNotHugo

2
谢谢,正是我所需要的。
MikeSchinkel

1
@Chevi这取决于您的要求。通常,将git项目作为子模块添加到您的项目中对于经常更改或仍在开发中的项目是一个很好的解决方案。这使您可以轻松地确保项目中的所有第三方代码都是最新的。对于本质上是静态的第三方代码(稳定的,成熟的代码,从版本到版本可能不会有太大变化),使用子模块不会提供太多价值。
回忆录,

2
抱歉,但与svn外在工具相比,这并不容易
Keil 2013年

2
@Keil这是两个命令,git submodule add而且git submodule update...我不确定它能获得多少方便。
13年

24

您需要知道的大多数信息都已经得到了回答,因此我不会费心解决这个问题,但是,我发现了一小部分通常会丢失的信息。

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

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

git submodule foreach git pull

如果您经常更改子模块,并且有很多子模块,那么“ git foreach”将变得非常宝贵。



0

我认为@Hugo的答案可能就是您所需要的并且效果很好。因此,我找到了一种更简单的方法。

git submodule update --remote

就这样。

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

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.