如何在一行中的所有子模块上实现git clone——递归和签出主机?

如何在一行中的所有子模块上实现git clone——递归和签出主机?,git,git-submodules,Git,Git Submodules,我非常喜欢使用以下命令获取带有子模块的回购: git clone git@github.com:my_user/my_repo.git --recursive 然而,当子模块到达时,它们都被设置为“无分支”,我必须手动检查每个子模块上的主模块。是否有一种递归拉子模块并自动设置分支到主控的方法?< P>也许你应该考虑GITSUBE作为GIT子模块的替代品,这取决于你的开发流程,它可能更好(或者更糟)。具体到您的问题,gitslave将超级项目的所有成员保持在同一分支上(没有特定的git(不是gi

我非常喜欢使用以下命令获取带有子模块的回购:

git clone git@github.com:my_user/my_repo.git --recursive

然而,当子模块到达时,它们都被设置为“无分支”,我必须手动检查每个子模块上的主模块。是否有一种递归拉子模块并自动设置分支到主控的方法?

< P>也许你应该考虑GITSUBE作为GIT子模块的替代品,这取决于你的开发流程,它可能更好(或者更糟)。具体到您的问题,gitslave将超级项目的所有成员保持在同一分支上(没有特定的git(不是gitslave)命令来执行其他操作,甚至当您在不同的分支上时,许多命令都会向您发出警告)

当您与超级项目同时控制和开发子项目时,以及当您通常希望同时标记、分支、推送、拉取等所有存储库时,此功能非常有用

如果您不控制子项目,或者更具体地说,希望在子项目发生变化时以特定版本修复子项目,git子模块会更好。

如何:

git submodule update --init --recursive

初始化所有子模块和子模块内的子模块。但不确定这是否将签出主控形状。

问题是为什么要签出主控形状。您的子模块被固定到特定的sha,这也是为什么子模块克隆被固定到该特定提交的原因。通过不指向特定的sha,外部回购很容易破坏您的构建。绝对不是你想要的。最好有意识地更新。构建应是可复制的,并尽可能修复。

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

git submodule foreach --recursive git checkout master
如前所述

git submodule foreach --recursive git checkout master
为分行行长做这项工作

但是如果不是所有子模块中都存在分支 可以使用

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

否则,在没有指定分支的第一次回购时,该命令将失败。

我同意这一点,但这真的很烦人。如果特定提交属于分支,为什么子模块不能在此特定提交时在此分支中签出?因为提交ID是固定的,而分支可以移动。它们是两种不同的东西,可以指向子模块的两个不同快照。举个例子说明原因:我的团队和我使用子模块的中央回购作为一种超级回购,以收集所有较小的相关模块回购,在本地构建整个项目。它省去了手动下载15个以上不同repo的麻烦,特别是如果您想将环境移动到不同的机器、vm等。是否可以指定哪些子模块需要同步,哪些不需要同步?i、 e.要将某些子模块排除在这种行为之外?@Savagman:使用gitslave,在对一组从属模块执行命令时,有几种方法可以执行子集选择:正则表达式、包含子集的文件等。使用git子模块,您似乎可以通过在命令行上显式命名每个子模块来完成选择,但是我没有试过。谢谢。它不是签出主模块,只是所有子模块!(这正是我想要的)使用
git子模块foreach--recursive git checkout master
来签出每个子模块的master确切地说,我想在我的vim vundle dir中更新子模块,你可以将它添加到你的personal.gitconfig或repo的.git/config中,作为
[别名]
来获利!