如何只更新特定的git子模块?

时间:2013-05-24 06:27:30

标签: git git-submodules

因此,更新我的所有子模块都是通过运行

来完成的
git submodule foreach 'git pull origin master'

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

5 个答案:

答案 0 :(得分:34)

我最后通过搜索如何更新特定的子模块来结束,这对我来说,更新子模块到它的super-repo指向的ref。 这不是问题,也不是答案,只是标题。

所以希望能帮助像我这样的其他人对问题标题的回答是:

git submodule update <specific path to submodule>

将把这个子模块置于超级仓库中提交的ref状态。

答案 1 :(得分:26)

实际上正确的语法是:

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

答案 2 :(得分:11)

如果您刚刚克隆了包含子模块的仓库,则可以使用以下方法克隆特定子模块:

git submodule update --init submoduleName

这将克隆该子模块的主人,从他们可以cd进入子模块并拉出你需要的任何分支。

答案 3 :(得分:7)

来自git submodule documentation

  

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

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

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

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

git submodule update --remote bundle/syntastic

答案 4 :(得分:2)

  

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

使用Git 2.13:

git clone --recurse-submodules="bundle/syntastic"

作为Git 2.13(2017年第二季度)&#34;活跃子模块&#34;的一部分。功能(请参阅&#34; Ignore new commits for git submodule&#34;),您有来自commit bb62e0aBrandon Williams (bmwill)

  

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

     

教克隆--recurse-submodules以选择性地获取pathspec参数   它描述了应该递归初始化哪些子模块   克隆。
  如果未提供pathspec,--recurse-submodules将使用&#34; .&#34;的默认路径规则递归初始化并克隆所有子模块。
  为了构造更复杂的路径规范,--recurse-submodules可以多次给出。

     

这也会配置&{39; submodule.active&#39;配置选项   给定的pathspec,以便将来git submodule update的任何调用都能跟上pathspec。

     

此外,交换机&#39; --recurse&#39;从文档中删除   以及在选项数组中隐藏的标记,以简化选项   对于子模块。一个简单的--recurse&#39;不会传达正在发生的事情   递归,例如它可能意味着目录或树木(c.f。ls-tree)   在很多其他命令中我们已经有了--recurse-submodules&#39;意思是   递归到子模块,所以在这里宣传这个拼写为   真正的选择。

所以git clone --recursive man page现在读取:

--recurse-submodules[=<pathspec]:
  

创建克隆后,根据提供的pathspec 初始化和克隆子模块。

     

如果未提供pathspec,则会初始化并克隆所有子模块。

     

使用默认设置初始化和克隆子模块   生成的克隆已将submodule.active设置为提供的路径规范,或者&#34; .&#34; (如果没有提供pathspec,则表示所有子模块)   这相当于克隆完成后立即运行git submodule update --init --recursive。如果克隆,则忽略此选项   存储库没有工作树/结帐(即如果有的话)   已提供--no-checkout / -n--bare--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年第二季度)和#34; git clone --recurs&#34;效果更好。

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

  

parse-options:不要发出&#34;模棱两可的选项&#34;对于别名

     

更改选项解析机制,以便例如&#34; clone --recurs ...&#34;   没有错误,因为&#34; clone&#34;理解&#34; --recursive&#34;和   &#34; --recurse-submodules&#34;意思是同样的事情。

     

最初&#34;克隆&#34;只是理解 - 递归直到   ccdd3da中添加了--recurses-submodules别名(&#34; clone:添加   --recurse-submodules选项作为--recursive&#34;的别名,   2010-11-04,Git v1.7.4-rc0)。
  自bb62e0a(&#34; clone:教--recurse-submodules以来   可选择路径规范&#34;,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中。