我想添加一个引用特定(非主)分支的子模块。由于--depth=1
,以下命令只会获取主分支,所以它必定会失败;
git submodule add -b myBranch --depth=1 git@host.com:some/large/repo
由于submodule add
不支持--single-branch
,这是否意味着我的唯一选择是克隆整个存储库?
我想添加一个引用特定(非主)分支的子模块。由于--depth=1
,以下命令只会获取主分支,所以它必定会失败;
git submodule add -b myBranch --depth=1 git@host.com:some/large/repo
由于submodule add
不支持--single-branch
,这是否意味着我的唯一选择是克隆整个存储库?
从git-clone文档中可知:
--depth depth
创建一个浅克隆,并将历史记录截断到指定的提交次数。如果未使用--no-single-branch, 则会将代码库的主分支作为克隆的唯一分支。
--[no-]single-branch
仅克隆指定分支的历史记录,可以通过
--branch
选项或主要分支遥控的 HEAD 指针来指定。使用--depth
选项创建浅克隆时,默认情况下只克隆单个分支的历史记录, 如果使用--no-single-branch
,则会获取所有分支的最新历史记录. 进一步地,在得出的仓库中进行的取回操作仅会更新用于初始克隆的选项所用分支的远程跟踪分支。如果遥控的 HEAD 指向任何分支,则不会创建远程跟踪分支。
因此,如果git submodule add
使用git clone
执行克隆,则在您的用例中隐含了--single-branch
。但是,仅当git submodule add
将-b
选项转发到git clone
时,它才能正常工作。
实现期望结果的一种保证方式(不做任何git submodule
的内部机制假设)是使用您选择的选项git clone
子模块代码库,然后将现有目录作为子模块添加:
git clone -b myBranch --single-branch --depth=1 git@host.com:some/large/repo large_repo
git submodule add -b myBranch git@host.com:some/large/repo large_repo
git submodule add 选项 仓库地址 [路径]
...
路径 是克隆的子模块在超级项目中相对位置,如果路径 不存在,则通过指定的 URL 克隆子模块并创建。如果路径存在且已经是有效的 Git 仓库,则将其添加到变更集中而不进行克隆操作。
git submodule add
不支持--single-branch
。然而,第二部分看起来是合法的。 - Stafford Williamsgit submodule add
将一些工作委托给git clone
,因此如果它将-b
和--depth
选项传递给git clone
,那么克隆将隐式地在--single-branch
模式下执行。但是,如果你有疑虑,就采用更安全的第二种方法(这就是为什么我在我的答案中包含它的原因)。 - Leongit pull --recurse-submodules
却拉取了子模块中的所有其他分支。 - Terry Brown