我正在尝试将子模块放入存储库中。问题是当我克隆父仓库时,子模块文件夹完全是空的。

有什么方法可以使git clone parent_repo实际将数据放入子模块文件夹中?

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

评论

该命令将是git clone --recurse-submodules --remote-submodules(Q3 2019 Git 2.23):它将在一个命令中克隆和更新子模块。请参阅下面我编辑的答案。

您有机会放弃--remote-submodules而只做--recurse-submodules。当心。

#1 楼

在Git 2.13和更高版本中,可以使用--recurse-submodules代替--recursive

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar


编者注:-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


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

git clone --recursive git://github.com/foo/bar.git
cd bar


对于已经克隆的存储库或较旧的Git版本,用途:

git clone git://github.com/foo/bar.git
cd bar
git submodule update --init --recursive


评论


有什么方法可以将此行为指定为git存储库中的默认行为,以便通知较少的克隆程序将自动获取已初始化的子模块?

–NHDaly
13年2月20日在6:37

@NHDaly可悲的是,没有。 (至少我不知道。)

–玛蒂亚斯·拜恩斯(Mathias Bynens)
13年2月20日在7:25

从逻辑上讲git clone --recursive还将填充子模块的任何子模块,对吗?

– Jayarjo
13年4月10日在17:31

@toszter:如此明智吗?如果保留存储库需要不是主模块的子模块版本,该怎么办?

–Gauthier
15年4月29日在12:27

另外要弄清楚(因为我想知道并且只能通过查看源代码才能找到答案),git clone --recursive和--recurse-submodules选项的行为相同。它们导致对同一功能的调用。

– Michael Burr
18年11月28日在0:52

#2 楼

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

git submodule init 
git submodule update


评论


我担心...这没有任何意义,因为在这种情况下您要签出部分项目。我知道子模块更新不是自动的,但是为什么绑定的版本没有自动检出呢?有什么办法强迫它吗?我有一个带有3个级别的子模块的项目,似乎为了进行检出而不得不走那么远是荒谬的。

–马克
2010-09-26 7:26

请阅读git-submodule(1)手册页(kernel.org/pub/software/scm/git/docs/git-submodule.html)。您会发现git子模块更新支持一个不错的参数--recursive。

– joschi
2010-09-26 7:30

为什么不只在一个命令中同时执行它们呢? git子模块更新--init(另请参见我的答案)。

–玛蒂亚斯·拜恩斯(Mathias Bynens)
2010-12-15 13:04



我认为最好用这两个命令来回答这个问题。它更好地说明了如何完成任务。

–schmijos
13年4月17日在18:20



@MathiasBynens我刚刚登录的机器只有git 1.5.5.6,它显然不支持缩短的指令,但确实支持两个命令。

–杰克·普尔森(Jack Poulson)
13年7月24日在18:40

#3 楼

Git 2.23(Q3 2019):如果要克隆子模块并将其更新到最新版本:
git clone --recurse-submodules --remote-submodules

如果只想在记录的SHA1上克隆它们:
git clone --recurse-submodules

请参阅下文。
请注意,Git 2.29(Q4 2020)在子模块处理方面带来了重大优化。
请参阅Orgad Shaneh(orgads)提交的commit a462bee(06 Sep 2020)。(由Junio C Hamano合并- -gitster-在2ce9d4e提交中,2020年9月18日)


submodule:禁止检查对象ID的文件名和引用歧义
签名者:Orgad Shaneh


collect_changed_submodules()的argv参数仅包含对象ID(所有引用的对象引用)。​​
通过传递setup_revisions()来通知assume_dashdash,输入不是文件名,这样可以避免冗余每个引用的统计信息。
也禁止使用refname_ambiguity标志以避免每个对象的文件系统查找。在cat-file,pack-objects等中可以找到类似的逻辑。
此更改将我回购中git fetch(man)的时间从25s减少到6s。


原始答案2010
正如joschi在评论中提到的那样,git submodule现在支持--recursive选项(Git1.6.5及更高版本)。

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

请参阅init递归使用git子模块。
有关更多信息,请参见git submodule

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

git clone --recursive git://github.com/mysociety/whatdotheyknow.git


用git 2.8更新2016:请参阅“如何加快速度” /使用git clone --recursive并行化git子模块的下载?“
您可以并行使用多个线程来启动获取子模块。
例如:
git fetch --recurse-submodules -j2


甚至更好,使用Git 2.23(Q3 2019),您可以克隆并通过一个命令将子模块检出到其跟踪分支!
请参阅Ben Avison(bavison)提交的commit 4c69101(2019年5月19日)(由Junio C Hamano合并-gitster-在2019年6月17日提交9476094号提交中)


clone:添加--remote-submodules标记


使用git clone --recurse-submodules时以前没有办法
将<43传递给隐式--remote命令用于
您希望将子模块放置在任何情况下已在其
远程跟踪分支上检出,而不是在超级项目中记录的SHA-1检出。


此修补程序纠正了这种情况。
它实际上通过了git submodule update也可以从--no-fetch移植到子模块,因为从子模块刚刚被克隆,所以再次从远程获取仅会减慢速度。

这意味着:
--[no-]remote-submodules:


所有克隆的子模块将使用子模块的远程跟踪分支的状态来更新子模块,而不是超级项目的已记录SHA-1。等效于将git submodule update传递给--remote


评论


因此,Git花了14年的时间才开始为子模块添加适当的支持,呵呵。感谢更新!如果我已经有一个主仓库的副本,没有子模块,也没有记录的SHA1,并且我想获取每个子模块的最新版本怎么办?可以吗?

–紫罗兰色长颈鹿
19年9月9日在9:48



@VioletGiraffe如果该克隆的存储库包含子模块,则它已“记录SHA1”。 git子模块update --init --recursive --remote应该将它们更新为各自分支的最新提交。 (例如:stackoverflow.com/a/56981834/6309)

–VonC
19 Sep 9'在10:14



让我用一个例子来阐明:我在Github上有一个使用子模块的模板项目,我甚至将子模块的特定修订提交到了这个模板仓库中。但是,当我从该存储库创建一个新项目时,您列出的命令(克隆--recurse-submodules --remote-submodules或子模块更新--init --recursive --remote)都没有让我实际获取该子存储库。我得到的只是一个.gitmodules文件,除了手动逐个克隆子存储库之外,我找不到其他方法来初始化子存储库。我想至少有一个脚本可以用子模块foreach来做...

–紫罗兰色长颈鹿
19-09-10在5:12



如果您知道解决方案,请问一个单独的问题,您可以回答。这是测试仓库,除了手动以外,我找不到其他方法可以初始化:github.com/VioletGiraffe/TEST

–紫罗兰色长颈鹿
19-09-10在5:13



@VioletGiraffe那是因为您添加并提交了.gitmodules而不是gitlink(stackoverflow.com/a/16581096/6309,索引中的特殊条目:stackoverflow.com/a/19354410/6309)这是一个存储库已经注册了正确的gitlink:github.com/tiagomazzutti/antlr4dart

–VonC
19年9月10日在6:20

#4 楼

[快速解答]
您可以使用此命令来克隆所有子模块的仓库:
git clone --recursive YOUR-GIT-REPO-URL

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


#5 楼

如果将子模块添加到分支中,请确保将其包含在克隆命令中...

git clone -b <branch_name> --recursive <remote> <directory>


评论


这更像是我在寻找的东西……但是子模块将其分支列为“分离的”。 :(

– AceFunk
19年7月25日在13:25

#6 楼

尝试以下操作:

git clone --recurse-submodules


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

评论


请注意,--recurse-submodules和--recursive是等效的别名。

–乔尔·普拉(Joel Purra)
13年1月16日在18:57

在这种情况下,@ SuperUberDuper可以执行git子模块更新--init --recursive,如本答案中所述

– Enrico
16 Mar 19 '16 at 15:43

#7 楼

我认为您可以执行3个步骤:

git clone
git submodule init
git submodule update


#8 楼

[快速解答]
克隆父仓库(包括某些子模块仓库)后,请执行以下操作:
git submodule update --init --recursive


#9 楼

后一个答案

// git CLONE INCLUDE-SUBMODULES ADDRESS DESTINATION-DIRECTORY
git clone --recursive https://USERNAME@bitbucket.org/USERNAME/REPO.git DESTINATION_DIR


我花了整整一个小时摆弄一个朋友:即使您拥有BitBucket的管理员权限,也请始终克隆ORIGINAL存储库并使用密码拥有回购协议的人之一。恼人地发现您遇到了这个陷阱:P

评论


那正是我要处理的。那么,您是说需要在具有子模块的Bitbucket存储库上进行开发的任何人都必须使用存储库创建者的凭据吗?布莱克

–jsleuth
13年5月29日在19:28

@jsleuth似乎如此-很糟糕...我知道。

– kaiser
13年5月29日在20:35

听起来像个虫子。您向Bitbucket报告了吗?

–玛蒂亚斯·拜恩斯(Mathias Bynens)
2014年9月5日19:51

@MathiasBynens您是否偶然发现了这个问题?一年半之后,我实际上不知道是否仍然如此。

– kaiser
2014年9月5日在21:31

它没有描述性地回答OP的问题,但是详细介绍了Bitbucket中一个不相关的错误;顺便提一下,可以将其缩短为“使用SSH密钥身份验证”。

–特雷菲农
17年2月14日在3:44

#10 楼

克隆存储库时,可以使用--recursive标志。此参数强制git克隆存储库中所有已定义的子模块。 >
git clone --recursive git@repo.org:your_repo.git


#11 楼

尝试将其包含在git存储库中。

git clone -b <branch_name> --recursive <remote> <directory>




git clone --recurse-submodules


#12 楼

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

git fetch --recurse-submodules --jobs=4


根据Git团队,这可以大大加快更新包含许多子模块的存储库的速度。在不使用新的--jobs选项的情况下使用--recurse-submodules时,Git将一个接一个地获取子模块。

来源:http://www.infoq.com/news/2016/03/git28发布

#13 楼

对于GitHub存储库,我遇到了同样的问题。我的帐户缺少SSH密钥。该过程是


生成SSH密钥
将新的SSH密钥添加到GitHub帐户

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



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

评论


是的,那是权限被拒绝(公钥)。致命:无法从远程存储库读取。错误

–恩德
19年11月14日在9:34

#14 楼

如果这是一个新项目,只需执行以下操作即可:

$ git clone --recurse-submodules https://github.com/chaconinc/YourProjectName 


如果已安装,则比:

$ cd YourProjectName (for the cases you are not at right directory) 
$ git submodule init
$ git submodule update


#15 楼

尝试一下。

git clone -b <branch_name> --recursive <remote> <directory>


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