【问题标题】:Is a full clone the only way to submodule add a branch?完整克隆是子模块添加分支的唯一方法吗?
【发布时间】:2018-07-28 00:48:02
【问题描述】:

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

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

因为submodule add 不支持--single-branch,这是否意味着我唯一的选择是克隆整个repo?

【问题讨论】:

    标签: git


    【解决方案1】:

    来自documentation of git-clone

    --深度 深度

    创建一个浅克隆,其历史被截断为指定 提交的数量。 暗示--single-branch 除非--no-single-branch 用于获取所有分支尖端附近的历史记录。

    --[no-]单分支

    仅克隆导致单个分支尖端的历史记录, 由--branch 选项或主分支指定 遥控器的 HEAD 指向。 当使用 --depth 选项,这是默认的,除非--no-single-branch 用于获取所有分支尖端附近的历史记录。 进一步提取到生成的存储库只会更新 用于该选项的分支的远程跟踪分支 初始克隆。如果遥控器的 HEAD 没有指向任何 进行--single-branch 克隆时的分支,没有远程跟踪 分支已创建。

    因此,如果git submodule add 使用git clone 执行克隆,那么在您的用例中--single-branch 是隐含的。但是,只有在git submodule add-b 选项转发给git clone 时,它才能正常工作。

    实现预期结果的有保证的方法(不对git submodule add 的内部工作做任何假设)是使用您选择的选项自行到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 子模块添加 选项 存储库 [路径]

    ...

    path 是克隆子模块存在于 超级项目。如果 path 不存在,则子模块由 从命名的 URL 克隆。 如果 路径 确实存在并且已经是有效的 Git 存储库,然后将其添加到变更集中而不进行克隆

    【讨论】:

    • 答案的第一部分无关紧要,因为git submodule add 不支持--single-branch,如问题中所述。但是,第二部分看起来是合法的。
    • @StaffordWilliams 我没有说git submodule add 支持--single-branch。我的意思是git submodule add -b myBranch --depth 1 调用git clone -b myBranch --depth 1,而后者将暗示--single-branch
    • 我想你是说你觉得--single-branch 应该存在于submodule add,因为submodule add --depth 的存在,即使它不存在?
    • @StaffordWilliams 不,我是说git submodule add 将它的一些工作委托给git clone,所以如果它将-b--depth 选项传递给git clone,那么克隆将在--single-branch 模式下隐式执行。但是,如果您有疑问,请使用更安全的第二种方法(这就是我将其包含在答案中的原因)。
    • 所以我应该可以将--single-branchsubmodule add 一起使用?
    猜你喜欢
    • 2013-03-25
    • 1970-01-01
    • 2022-01-20
    • 2015-04-29
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    相关资源
    最近更新 更多