我如何在一行中的所有子模块上git clone --recursive和checkout master?

ted*_*suo 49 git git-submodules

我真的很喜欢这个命令来获取子模块的repo:

git clone git@github.com:my_user/my_repo.git --recursive
Run Code Online (Sandbox Code Playgroud)

但是,子模块到达时都设置为"无分支",我必须手动检查每个子模块.有没有办法递归拉取子模块并自动将分支设置为主?

小智 69

克隆包含子模块的存储库后,以下命令将一次性检出所有这些的主分支:

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


Mau*_*ord 55

怎么样:

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

初始化子模块内的所有子模块和子模块.不知道这是否会结账大师.

  • 使用`git submodule foreach --recursive git checkout master`来检查每个子模块的主服务器 (3认同)
  • 谢谢。它不结帐大师,只是所有的子模块!(这正是我想要的) (2认同)

tcu*_*rdt 24

现在的问题是,为什么你检出高手.您的子模块固定到特定的sha - 这也是子模块克隆固定到该特定提交的原因.通过不指向特定的sha,外部仓库很容易破坏你的构建.绝对不是你想要的.更有意识地更新.构建应该是可重现的并且尽可能地修复.

  • 因为提交ID是固定的,而分支可以移动.它们是两个不同的东西,可以指向子模块的两个不同的快照. (4认同)

Yes*_*ame 9

正如已经回答

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

为分支master做这项工作。

但是如果它是一个不存在于所有子模块中的分支,则可以使用

git submodule foreach --recursive "git checkout branchname || true"
Run Code Online (Sandbox Code Playgroud)

否则,该命令将在没有指定分支的第一个 repo 上失败。


Set*_*son 6

也许您应该将gitslave视为git-submodule的替代方案,这取决于您的开发工作流程,它可能更好(或更糟).特别针对您的问题,gitslave将超级项目的所有成员保留在同一分支上(缺少特定的git(而不是gitslave)命令,否则当您在不同的分支上时,许多命令会发出警告).

当您在超级项目的同时控制和开发子项目时,Gitslave非常有用,而且当您通常希望同时标记,分支,推送,拉取等所有存储库时.

当您不控制子项目或更具体地希望将子项目修复到特定修订时,即使子项目发生更改,git-submodule也会更好.