对一个Git仓库进行回溯性地添加--recursive选项

82

如果您使用--recursive参数进行git clone操作,则可以获取所有的git子模块。

如果我在克隆时忘记添加此神奇的标志,那该怎么获取任何子模块呢?

另外,如何将递归标志设置为将来克隆的默认选项?

4个回答

117

在进行简单的顶层克隆之后,您可以使用以下方法来执行此操作:

git submodule update --init --recursive

我不建议默认情况下让克隆执行此操作。如果您在开发中大量使用子模块,而不仅仅是链接到可能偶尔升级的第三方 OSS 库,请使用 git slavesubtree 的正确方式。


15
  1. 从你的代码库的根目录开始:

    $ git submodule update --init --recursive
    

    这将更新所有已注册的子模块,如果需要,则将它们初始化为在.gitmodules文件中找到的值,并递归到复杂的子模块(具有自己的子模块)并初始化和更新它们。

  2. 我知道的使克隆递归成为默认方式最简单的方法是使用别名来替代 git clone 命令。

  3. $ git config --global alias.clone = 'clone --recursive'
    

    就一直添加选项而言,我认为这是惯用的方法。


1
我建议不要覆盖“clone”命令,而是添加一个变体命令$ git config --global alias.cloner = 'clone --recursive' - Abizern
8
你们俩都需要移除等号符号:git config --global alias.clone 'clone --recursive' - ELLIOTTCABLE
6
很抱歉,但这个答案是完全错误的。Git不允许你“遮盖别名”一个已经存在的Git命令。alias.clone将被完全忽略。 - Jez
支持 Jez 的评论:是否可以通过 git 别名重写 git 命令? - Andrew T.

1

IIRC, git submodule initgit submodule update

不过很遗憾,我没有看到默认启用递归的选项。


你可以创建一个 shell 或 git 别名来执行递归克隆。然而,在这里分两步似乎更难,但这样你可以在 init 之后但在 update 之前在配置文件中更改子模块仓库的 URL。对于一些子模块已经设置为私有仓库 URL 的仓库,你需要将其更改为公共 URL,因此需要进行此操作。 - Abizern

1
看起来你不能使用别名“clone”覆盖“clone”,所以需要创建一个新的别名(Abizern的解决方案)或者使用“--recursive”选项。
这是一个相关问题的链接:是否可以通过git别名覆盖git命令?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接