'git submodule update --init --recursive'VS'git submodule foreach --recursive git submodule update --init'

Man*_*ish 50 git git-submodules

我有git repo,它有嵌套的子模块.以下2个命令有什么区别?

git submodule update --init --recursive

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

Mar*_*tin 49

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

子模块update命令将递归到已注册的子模块,更新和初始化(如果需要)以及其中的任何嵌套子模块.

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

foreach将评估每个签出子模块中的命令.因此它将更新和初始化(如果需要)每个子模块和任何嵌套的子模块--recursive.

所以最后,两个命令都会达到同样的效果.只是执行不同,第一个命令不会进入每个目录来执行命令.

  • 你会如何用递归更新单个子模块? (3认同)
  • @malhal cd 进入子模块,然后执行上述命令之一 (2认同)
  • “所以最终,两个命令都会实现同样的目标。” 不,他们不!例如,获取带有子模块的存储库,删除子模块文件夹或其部分内容,运行第二个命令:什么也没有发生。运行第一条命令:子模块已恢复。 (2认同)

nic*_*ldt 8

根据我的经验,第一个有效.第二个什么也没做.

对于像eclipse.platform.releng.aggregator这样的项目来初始化子模块以便你可以构建,你需要克隆所有子目录:

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


小智 5

存在差异!

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

将注册直接依赖的子模块并克隆它们,然后进入下一个深度,注册子模块并递归克隆它们。最后,所有直接或间接依赖的子模块都将从远程注册和克隆。 如果存在循环依赖,该命令将永不终止。

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

此命令遵循模板:

git submodule foreach --recursive "your command"
Run Code Online (Sandbox Code Playgroud)

这意味着首先,“git submodule foreach --recursive”将生成一个子模块集,然后在每个子模块中,您的命令被执行。但是,对于没有执行“git submodule init”然后“git submodule update”的初始项目,“git submodule foreach --recursive”将为空,因此“您的命令”根本不会发生。