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

问题描述 投票:45回答:5

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

git clone [email protected]:my_user/my_repo.git --recursive

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

git git-submodules
5个回答
65
投票

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

git submodule foreach --recursive git checkout master

55
投票

怎么样:

git submodule update --init --recursive

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


24
投票

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


6
投票

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

当你在与超级项目同时控制和开发子项目时,Gitslave非常有用,而且当你通常想要同时标记,分支,推送,拉取等所有存储库时。

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


2
投票

已经回答了

git submodule foreach --recursive git checkout master

做分行主人的工作。

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

git submodule foreach --recursive "git checkout branchname || true"

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

© www.soinside.com 2019 - 2024. All rights reserved.