完全克隆是将分支添加为子模块的唯一方法吗?

7

我想添加一个引用特定(非主)分支的子模块。由于--depth=1,以下命令只会获取主分支,所以它必定会失败;

git submodule add -b myBranch --depth=1 git@host.com:some/large/repo

由于submodule add不支持--single-branch,这是否意味着我的唯一选择是克隆整个存储库?

1个回答

6

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 仓库,则将其添加到变更集中而不进行克隆操作。


2
你的回答的第一部分是无关紧要的,因为正如问题中所指出的那样,git submodule add不支持--single-branch。然而,第二部分看起来是合法的。 - Stafford Williams
@StaffordWilliams 不,我的意思是 git submodule add 将一些工作委托给 git clone,因此如果它将 -b--depth 选项传递给 git clone,那么克隆将隐式地在 --single-branch 模式下执行。但是,如果你有疑虑,就采用更安全的第二种方法(这就是为什么我在我的答案中包含它的原因)。 - Leon
那么我应该能在“submodule add”命令中使用“--single-branch”选项吗? - Stafford Williams
@StaffordWilliams 已更新 - Leon
不确定第二种方法是否有效,至少不是我期望的方式。虽然明确克隆了--single-branch --depth 1和顶层repo,并告知要跟踪哪个分支,但是将事情设置为这样,从顶层执行git pull --recurse-submodules却拉取了子模块中的所有其他分支。 - Terry Brown
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接