如何"git克隆"包括子模块?

Mar*_*ark 1864 git git-submodules

我试图将子模块放入回购.问题是当我克隆父repo时,子模块文件夹是完全空的.

有没有办法让它git clone parent_repo实际上把数据放在子模块文件夹中?

例如,http://github.com/cwolves/sequelize/tree/master/lib/,nodejs-mysql-native指向在外部git的子模块,但是当我结账的sequelize项目,该文件夹为空.

Mat*_*ens 2843

使用Git及更高版本的2.13版本,--recurse-submodules可以代替--recursive:

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar
Run Code Online (Sandbox Code Playgroud)

编者注:-j8可选的性能优化在2.8版本中可用,并且一次最多可以获取8个子模块 - 参见man git-clone.

使用版本1.9的Git直到版本2.12(-j仅在2.8+版本中提供标记):

git clone --recursive -j8 git://github.com/foo/bar.git
cd bar
Run Code Online (Sandbox Code Playgroud)

使用Git及更高版本的1.6.5版,您可以使用:

git clone --recursive git://github.com/foo/bar.git
cd bar
Run Code Online (Sandbox Code Playgroud)

对于已经克隆的repos或较旧的Git版本,请使用:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法在git存储库中将此行为指定为默认值,以便不太知情的克隆者会自动获取初始化的子模块? (108认同)
  • @NHDaly可悲的是,没有.(至少我不知道.) (7认同)
  • 而逻辑思维的git clone --recursive也会填充子模块的任何子模块,对吧? (6认同)
  • @toszter:这么明智吗?如果持有回购需要一个*不是*`master`的子模块版本怎么办? (5认同)
  • @NHDaly似乎没有:http://stackoverflow.com/questions/4251940/retrospectively-add-recursive-to-a-git-repo (3认同)
  • @toszter即使这样,正确的提交也不一定在分支的最前端. (3认同)
  • 为什么递归克隆不是默认选项? (3认同)
  • 您可能需要考虑git子树https://blogs.atlassian.com/2013/05/alternatives-to-git-submodule-git-subtree/它解决了@NHDaly评论中的问题 (2认同)
  • @NHDa确定,只需在[alias]部分下将其添加到您的〜/ .gitconfig中:`cloner = clone --recursive` (2认同)
  • @slf 虽然这很有帮助,但它并没有回答@NHDaly 的问题。`.gitconfig` 设置是全局的,而不仅仅是针对单个存储库。 (2认同)
  • 我有git 1.9.1和`git clone --recursive -j8 git@bitbucket.org:repoToClone`不起作用.它告诉我'错误:未知开关`j'`如果我删除`-j8`它可以顺利运行 (2认同)
  • 我想我每个月都会回来一次此答案...为什么git不只是问克隆它是否也应该下载子模块? (2认同)
  • 为了清楚起见(因为我想知道并且无法找到答案,除非查看源代码),git clone`-recursive`和`-recurse-submodules`选项的行为相同。它们导致对同一功能的调用。 (2认同)

Lir*_*una 463

在填充子模块之前,您必须做两件事:

git submodule init 
git submodule update
Run Code Online (Sandbox Code Playgroud)

  • 为什么不在一个命令中同时执行这两个操作呢?`git submodule update --init`(另见[我的回答](http://stackoverflow.com/questions/3796927/git-clone-submodule/4438292#4438292)). (90认同)
  • 请阅读`git-submodule(1)`手册页(http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html).你会发现`git submodule update`支持一个名为`--recursive`的好参数. (10认同)
  • 我认为用这两个命令回答这个问题会更好.它更好地解释了如何完成任务. (9认同)
  • 我很害怕......因为你在这种情况下检查了一个部分项目,所以没有任何意义.我知道子模块更新不是自动的,但为什么绑定版本不会自动检出?有没有办法强迫它?我有一个包含3级子模块的项目,为了办理结账,我必须遍历那么远才是荒谬的. (8认同)
  • @MathiasBynens我刚登录的机器只有git 1.5.5.6,它显然不支持缩短的指令,但确实支持它作为两个命令. (6认同)

Von*_*onC 196

原答案2010

正如joschi在评论中提到的,git submodule现在支持--recursive选项(Git1.6.5及更多).

如果--recursive指定,则此命令将递归到已注册的子模块中,并更新其中的任何嵌套子模块.

请参阅init部分递归使用git子模块.
请参阅git submodule解释更多信息.

使用1.6.5版本的git及更高版本,您可以通过使用以下–-recursive选项克隆超级项目来自动执行此操作:

git clone --recurse-submodules --remote-submodules
Run Code Online (Sandbox Code Playgroud)

使用git 2.8更新2016:请参阅" 如何使用git clone --recursive?加速/并行化git子模块的下载? "

您可以并行使用多个线程启动子模块.
为实例:

git clone --recurse-submodules
Run Code Online (Sandbox Code Playgroud)

  • 所以 Git 花了 14 年才开始添加对子模块的适当支持,呵呵。感谢更新!如果我已经有一个没有子模块且没有记录的 SHA1 的主存储库的克隆,并且我想提取每个子模块的最新版本,该怎么办?可行吗? (9认同)
  • @VioletGiraffe 如果克隆的存储库有子模块,则它具有“记录的 SHA1”。并且 `git submodule update --init --recursive --remote` 应该将它们更新到各自分支的最新提交。(例如:/sf/answers/3988728411/) (2认同)

Jav*_* C. 65

您可以使用此命令克隆包含所有子模块的repo:

git clone --recursive YOUR-GIT-REPO-URL
Run Code Online (Sandbox Code Playgroud)

或者,如果您已经克隆了项目,则可以使用:

git submodule init
git submodule update
Run Code Online (Sandbox Code Playgroud)


Mar*_*yne 31

如果您的子模块已添加到分支中,请务必将其包含在克隆命令中...

git clone -b <branch_name> --recursive <remote> <directory>
Run Code Online (Sandbox Code Playgroud)


nwe*_*ler 28

试试这个:

git clone --recurse-submodules
Run Code Online (Sandbox Code Playgroud)

假设您已将子模块添加到父项目,它会自动提取子模块数据.

  • 请注意,`--recurse-submodules`和`--recursive`是[等效别名](https://www.kernel.org/pub/software/scm/git/docs/git-clone.html). (37认同)
  • @SuperUberDuper在这种情况下,你可以按照[这个答案](/sf/answers/310680471/)中的说明执行`git submodule update --init --recursive` (2认同)

小智 23

我想你可以用3个步骤,

git clone
git submodule init
git submodule update
Run Code Online (Sandbox Code Playgroud)


kai*_*ser 20

迟到的答案

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR
Run Code Online (Sandbox Code Playgroud)

因为我花了整整一个小时与朋友一起摆弄:即使你拥有BitBucket的管理员权限,也要克隆ORIGINAL存储库并使用拥有repo的人的密码.很恼火,发现你遇到了这个陷阱:P

  • 它没有描述性地回答OP的问题,但详细说明了Bitbucket中一个不相关的错误; 顺便提一下,它可以缩短为"使用SSH密钥认证". (4认同)

小智 18

试试这个在git仓库中包含子模块.

git clone -b <branch_name> --recursive <remote> <directory>
Run Code Online (Sandbox Code Playgroud)

要么

git clone --recurse-submodules
Run Code Online (Sandbox Code Playgroud)


Ahm*_*imi 15

--recursive克隆存储库时可以使用参数.此参数强制git克隆repo中所有已定义的子模块.

git clone --recursive git@repo.org:your_repo.git
Run Code Online (Sandbox Code Playgroud)

克隆后,有时子模块分支可能会发生变化,因此请在之后运行此命令:

git submodule foreach "git checkout master"
Run Code Online (Sandbox Code Playgroud)


Ben*_*ari 14

[快速回答]

克隆父仓库(包含一些子模块仓库)后,请执行以下操作:

git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)


Ant*_*ons 14

使用此命令克隆所有子模块的 repo

git clone --recurse-submodules git@gitlab.staging-host.com:yourproject
Run Code Online (Sandbox Code Playgroud)

更新所有子模块的代码

git submodule update --recursive --remote
Run Code Online (Sandbox Code Playgroud)


小智 11

子模块并行提取旨在通过一次启用多个存储库的获取来减少获取存储库及其所有相关子模块所需的时间.这可以通过使用新的--jobs选项来完成,例如:

git fetch --recurse-submodules --jobs=4
Run Code Online (Sandbox Code Playgroud)

根据Git团队的说法,这可以大大加快更新包含许多子模块的存储库.当使用没有新的--jobs选项的--recurse-submodules时,Git将逐个获取子模块.

资料来源:http://www.infoq.com/news/2016/03/git28-released


小智 7

我对GitHub存储库有同样的问题。我的帐户缺少SSH密钥。这个过程是

  1. 生成SSH密钥
  2. 向您的GitHub帐户添加新的SSH密钥

然后,您可以使用子模块(git clone --recursive YOUR-GIT-REPO-URL)克隆存储库

要么

运行git submodule initgit submodule update在已克隆的存储库中获取子模块。


小智 5

尝试这个。

git clone -b <branch_name> --recursive <remote> <directory>
Run Code Online (Sandbox Code Playgroud)

如果已将子模块添加到分支中,请确保将其添加到clone命令。


nzr*_*tmn 5

If it is a new project simply you can do like this :

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 
Run Code Online (Sandbox Code Playgroud)

If it is already installed than :

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update
Run Code Online (Sandbox Code Playgroud)


Raj*_*nga 5

只需在您的项目目录中执行这些操作。

$ git submodule init
$ git submodule update
Run Code Online (Sandbox Code Playgroud)

  • 如果您之前已经克隆过您的存储库,那么这是正确的答案。 (5认同)

归档时间:

查看次数:

783576 次

最近记录:

5 年,9 月 前