223

我想创建一个拉入远程仓库的仓库。

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

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

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

此外,一旦设置完成,如果我推/拉到我自己的遥控器,外部是否会保持不变?

4

4 回答 4

359
  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再次发出命令。请注意:我的项目中通常有许多外部存储库,因此我总是将存储库分组在“外部”目录下。

在线Pro Git Book有一些关于子模块(和一般的 git)的很好的信息,以易于阅读的方式呈现。或者,git help submodule也会提供很好的信息。或者查看git wiki 上的Git 子模块教程。

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

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

于 2011-03-05T18:17:12.373 回答
26

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

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

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

git submodule foreach git pull

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

于 2012-05-11T04:06:44.110 回答
3

最后我发现http://github.com/evilchelu/braid它似乎符合我期望子模块和遥控器的工作方式

于 2010-05-31T11:39:03.013 回答
1

我认为@Hugo 的答案可能是您所需要的并且可以正常工作。所以我找到了一个更简单的方法。

git submodule update --remote

就这样。

所以一个完整的工作流程可能是:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
于 2016-01-20T10:44:34.083 回答