【问题标题】:How to only update specific git submodules?如何只更新特定的 git 子模块?
【发布时间】:2013-05-19 16:40:24
【问题描述】:

所以,更新我所有的子模块是通过运行来完成的

git submodule foreach 'git pull origin master'

如何更新位于bundle/syntastic 中的特定子模块,而不更新任何其他子模块?

【问题讨论】:

  • 使用 Git .213(2017 年第二季度),您可以考虑使用 git clone --recurse-submodules="bundle/syntastic"。见my answer below
  • @VonC :此检查链接的子模块版本,它没有像git submodule foreach 'git pull origin master' 那样将其更新到主模块的 HEAD。
  • @mpromonet 好点:[我的(现已编辑的)答案](stackoverflow.com/a/43441315/6309. 中缺少配置设置

标签: git git-submodules


【解决方案1】:

我最终通过搜索如何仅更新特定子模块来结束,这对我来说意味着将子模块更新为其超级存储库指向的引用。 这不是问题也不是答案,而只是标题。

因此,希望对像我这样的其他人有所帮助,问题标题的答案是:

git submodule update <specific path to submodule>

这会将这个子模块置于超级仓库中提交的引用的状态。

【讨论】:

  • 这是我一直在寻找的答案,但(如前所述)这不是 OP 的答案。也许比我更有权力的人可以将其转化为正确问题的答案(并可能更改此问题的标题以防止混淆)。
【解决方案2】:

其实正确的语法是:

$ git clone <remote.git>
$ cd <remote>
$ git submodule update --init -- <specific relative path to submodule>

【讨论】:

    【解决方案3】:

    如果你刚刚克隆了一个带有子模块的仓库,你可以克隆一个特定的子模块:

    git submodule update --init submoduleName

    这将克隆该子模块的主模块,您可以从它们 cd 进入子模块并拉取您需要的任何分支。

    【讨论】:

    • 此命令克隆 repo 引用的子模块的版本,它不会用 master 的 HEAD 更新子模块。
    【解决方案4】:

    来自git submodule documentation

    --remote 该选项仅对更新命令有效。不要使用超级项目记录的 SHA-1 来更新子模块,而是使用 子模块的远程跟踪分支的状态。使用的遥控器是 分支的远程(branch..remote),默认为原点。

    为了更新特定的子模块,您可以使用:

    git submodule update --remote <path to the submodule>
    

    在你的情况下,它应该是:

    git submodule update --remote bundle/syntastic
    

    【讨论】:

    • 顺序很重要。即,这将不起作用:git submodule update &lt;path to the submodule&gt; --remote
    • 从哪里运行它似乎也很重要。例如,如果您正在处理具有嵌套子模块的存储库,则需要从使用您尝试定位的子模块的目录执行此操作,而不是在其内部或外部,无论绝对路径如何。
    【解决方案5】:

    如何在不更新任何其他子模块的情况下更新位于 bundle/syntastic 中的特定子模块?

    使用 Git 2.13(以及 submodule.&lt;name&gt;.update config setting 的帮助):

    git clone --recurse-submodules="bundle/syntastic"
    git config submodule.syntastic.update "git pull origin master"
    

    需要第二行(只执行一次),因为clone --recurse-submodules[=&lt;pathspec] 命令相当于在克隆完成后立即运行git submodule update --init --recursive &lt;pathspec&gt;
    这只会在其 gitlink 记录的 SHA1 中检查子模块,不是在最新的远程 origin/masterSHA1。
    通过添加submodule.&lt;name&gt;.update config setting,您可以确保子模块的选择性克隆之后将更新,仅针对该子模块。


    作为 Git 2.13(2017 年第二季度)“活动子模块”功能的一部分(请参阅“Ignore new commits for git submodule”),您拥有来自 Brandon Williams (bmwill)commit bb62e0a

    clone:教 --recurse-submodules 选择采用路径规范

    教克隆--recurse-submodules 选择使用路径规范参数 它描述了哪些子模块应该被递归初始化和 克隆。
    如果未提供路径规范,--recurse-submodules 将使用默认路径规范“.”递归初始化和克隆所有子模块。
    为了构造更复杂的路径规范,--recurse-submodules 可以多次给出。

    这也将“submodule.active”配置选项配置为 给定的路径规范,这样以后对git submodule update 的任何调用都将跟上路径规范。

    此外,开关“--recurse”已从文档中删除为 以及在选项数组中标记为隐藏,以简化选项 对于子模块。一个简单的 '--recurse' 并不能传达正在发生的事情 递归的,例如它可能意味着目录或树 (c.f. ls-tree)。
    在许多其他命令中,我们已经有 '--recurse-submodules' 来表示 递归到子模块中,所以在这里宣传这个拼写作为 真正的选择。

    所以git clone --recursive man page 现在变为:

    --recurse-submodules[=<pathspec]:
    

    创建克隆后,根据提供的路径规范初始化并克隆其中的子模块

    如果没有提供路径规范,所有子模块都会被初始化和克隆。

    使用默认设置初始化和克隆子模块。
    生成的克隆将submodule.active 设置为提供的路径规范,如果未提供路径规范,则为“.”(表示所有子模块)。
    这相当于在克隆完成后立即运行git submodule update --init --recursive。如果克隆了该选项,则忽略此选项 存储库没有工作树/结帐(即,如果任何 --no-checkout/-n, --bare, or --mirror 给定)

    来自t/t7400-submodule-basic.sh test的示例:

    git clone --recurse-submodules="." \
              --recurse-submodules=":(exclude)sub0" \
              --recurse-submodules=":(exclude)sub2" \
              multisuper multisuper_clone
    

    这将克隆和更新每个子模块,sub0sub2 除外。


    奖励,使用 Git 2.22(2019 年第二季度)“git clone --recurs”效果更好。

    参见Nguyễn Thái Ngọc Duy (pclouds)commit 5c38742(2019 年 4 月 29 日)。
    (由 Junio C Hamano -- gitster -- 合并到 commit 2cfab60,2019 年 5 月 19 日)

    parse-options: 不要为别名发出“模糊选项”

    更改选项解析机制,例如“clone --recurs ...” 不会出错,因为“clone”同时理解“--recursive”和 “--recurse-submodules”表示相同的意思。

    最初“克隆”只是理解 --recursive 直到 --recurses-submodules 别名已添加到 ccdd3da ("clone: 添加 --recurse-submodules 选项作为 --recursive 的别名", 2010-11-04,Git v1.7.4-rc0)。
    bb62e0a("clone:教--recurse-submodules到 可选地采用路径规范”,2017-03-17,Git v2.13.0-rc0) 较长的形式是 提升为默认值。

    但是由于选项解析机器的工作方式,这导致了 在相当荒谬的情况下:

    $ git clone --recurs [...]
    error: ambiguous option: recurs (could be --recursive or --recurse-submodules)
    

    添加OPT_ALIAS() 表示两个或多个选项之间的这种联系并使用 它在 git-clone 中。

    【讨论】:

    • 此检查链接的子模块版本,它没有像git submodule foreach 'git pull origin master' 那样将其更新到主模块的 HEAD。
    猜你喜欢
    • 2014-06-23
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2011-12-04
    • 1970-01-01
    • 2012-04-27
    • 2012-09-14
    相关资源
    最近更新 更多