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

如何";“git克隆”;包括子模块?,git,git-submodules,Git,Git Submodules,我想把一个子模块放到回购协议中。问题是,当我克隆父repo时,子模块文件夹完全为空 有没有办法让git clone parent\u repo将数据实际放入子模块文件夹 例如,nodejs mysql native指向一个外部git子模块,但是当我签出sequelize项目时,该文件夹是空的。在填充子模块之前,您必须做两件事: git submodule init git submodule update Git 2.23(2019年第3季度):如果要克隆子模块并将其更新为最新版本: git

我想把一个子模块放到回购协议中。问题是,当我克隆父repo时,子模块文件夹完全为空

有没有办法让git clone parent\u repo将数据实际放入子模块文件夹


例如,
nodejs mysql native
指向一个外部git子模块,但是当我签出
sequelize
项目时,该文件夹是空的。

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

git submodule init 
git submodule update
Git 2.23(2019年第3季度):如果要克隆子模块并将其更新为最新版本:

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

git clone --recurse-submodules
见下文

请注意,Git2.29(2020年第4季度)带来了关于子模块处理的重大优化

参见作者(2020年9月6日)
(于2020年9月18日合并)

:禁止检查对象ID的文件名和引用模糊性 签字人:Orgad Shaneh

collect\u changed\u submodules()
的argv参数仅包含对象ID(所有引用的对象引用)

通过传递
假设dashdash,
通知
setup\u revisions()
输入不是文件名,这样可以避免每个ref的冗余stat

还可以抑制
refname\u模糊性
标志,以避免对每个对象进行文件系统查找。类似的逻辑可以在cat文件、包对象等中找到

此更改将我的回购中()的时间从25秒减少到6秒


原始答案2010

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

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

有关初始部分,请参阅。
有关更多信息,请参见

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


使用git 2.8更新2016:请参阅“”

您可以使用多个线程并行地开始获取子模块。
例如:

git fetch --recurse-submodules -j2

更好的是,使用Git 2.23(2019年第3季度),您可以通过一个命令将子模块克隆并签出到其跟踪分支

参见。
(于2019年6月17日合并)

克隆
:添加
--远程子模块
标志 当使用git clone--recurse子模块时 将
--remote
开关传递到隐式
git子模块更新
命令 您希望在其子模块上签出子模块的任何用例 远程跟踪分支,而不是超级项目中记录的SHA-1

此修补程序可纠正这种情况。
它实际上将
--no fetch
传递给
git子模块update
,理由是他们刚刚克隆了子模块,因此再次从远程获取只会降低速度

这意味着:

--[no-]remote-submodules:
克隆的所有子模块将使用子模块远程跟踪分支的状态来更新子模块,而不是超级项目记录的SHA-1。相当于将
--remote
传递到
git子模块更新


对于Git的2.13版和更高版本,可以使用
--recurse子模块
代替
--recursive

git clone --recurse-submodules -j8 git://github.com/foo/bar.git
cd bar
编者按:
-j8
是一种可选的性能优化,在2.8版中可用,一次最多可并行获取8个子模块-请参阅
man git clone

Git的1.9版一直到2.12版(
-j
标志仅在2.8+版中可用):

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

git clone --recursive git://github.com/foo/bar.git
cd bar
git submodule init
git submodule update
对于已克隆的回购协议或较旧的Git版本,请使用:

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

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

git clone -b <branch_name> --recursive <remote> <directory>
git克隆-b——递归
试试这个:

git clone --recurse-submodules
如果您已经将子模块添加到父项目中,它会自动提取子模块数据。

延迟回答


我刚刚花了整整一个小时和一个朋友闲逛:即使你对BitBucket拥有管理员权限,也要克隆原始存储库,并使用回购协议所有者的密码。令人恼火的是,您遇到了这个地雷陷阱:P

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

git fetch --recurse-submodules --jobs=4
Git团队认为,这可以大大加快包含许多子模块的存储库的更新速度。在不使用new--jobs选项的情况下使用--recurse子模块时,Git将逐个获取子模块

来源:

[快速回答] 您可以使用此命令克隆带有所有子模块的回购:

git clone --recursive YOUR-GIT-REPO-URL
或者,如果已经克隆了项目,则可以使用:

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

尝试在git存储库中包含子模块

git clone -b <branch_name> --recursive <remote> <directory>
git clone --recursive git@repo.org:your_repo.git
试试这个

git clone -b <branch_name> --recursive <remote> <directory>
git克隆-b——递归

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

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

git clone
git submodule init
git submodule update
克隆存储库时,可以使用
--recursive
标志。此参数强制git克隆存储库中所有定义的子模块

git clone -b <branch_name> --recursive <remote> <directory>
git clone --recursive git@repo.org:your_repo.git
克隆后,有时子模块分支可能会更改,因此请在克隆后运行以下命令:

git submodule foreach "git checkout master"
[快速回答] 克隆父repo(包括某些子模块repo)后,请执行以下操作:

git submodule update --init --recursive

如果是一个新项目,您可以这样做:

$ 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

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

  • 然后,您可以克隆re
    $ git submodule init
    $ git submodule update
    
    git clone --recurse-submodules git@gitlab.staging-host.com:yourproject
    
    git submodule update --recursive --remote
    
    git submodule foreach git pull origin master