“git submodule foreach git pull origin master”和“git pull origin master --recurse-submodules”有什么区别?

时间:2015-10-29 17:58:21

标签: git recursion git-submodules

我有一个dotfiles存储库,其中所有的vim插件都存储为子模块,因此在更改时很容易更新。我认为这两个命令做了同样的事情,但我注意到情况绝对不是这样。

我知道我有几个子模块的更新,所以我从父存储库的根目录运行git pull origin master --recurse-submodules。它似乎迭代每个子模块,但只从其原始存储库获取更新。

当我运行git submodule foreach git pull origin master时,它实际上在每个存储库中运行git pull origin master,同时执行获取和合并。

使用--recurse-submodules有什么意义?我对它实际上要做的事情感到有点困惑,谷歌对我发现的东西有点神秘。我想也许你聪明的人会有一个更简单的解释。

2 个答案:

答案 0 :(得分:7)

该选项主要用于获取所有子模块提交,而不仅仅是像master一样拉出一个特定的分支,原因如下两个提交: (注意Git 2.11中有一个错误,请参见本答复的末尾)

对于git pull,此选项已在(commit 7dce19d, Nov. 2010, git 1.7.4-rc0)

中引入
  

fetch / pull:添加--recurse-submodules选项

     

到现在为止,您必须致电" git submodule update" (没有-N|--no-fetch选项)或类似" git submodule foreach git fetch"从远程端获取填充子模块中的新提交。

     

这可能导致" (commits not present)"输出中的消息   " git diff --submodule" (由" git gui"和" gitk")使用   在超级项目中获取或提取新提交并且是一个障碍   实现子模块的递归检验   另外" git submodule update"断开连接时无法获取更改,因此很容易忘记在断开连接之前获取子模块更改,以便稍后发现它们是必需的。

     

此补丁添加" --recurse-submodules"递归获取的选项   每个填充的子模块来自在.git/config中配置的URL   每个结尾的子模块" git fetch"或在" git pull"在里面   上层项目。子模块路径取自索引。

Commit 88a2197 (March 2011, git 1.7.5-rc1)解释了一下:

  

fetch / pull:在必要时递归到子模块

     

能够访问由。引用的所有已填充子模块的提交   超级项目,只需要让#34; git fetch"进入一个   在超级项目中获取的新提交记录新的子模块   承诺它。

     
      
  • 在使用" --submodule"时,提交这些提交非常有用。选项" git diff" (这是" git gui"和   " gitk"从1.6.6开始,因为所有子模块提交都需要创建一个   可以访问描述性输出。
  •   
  • 同样合并子模块提交(在1.7.3中添加)取决于存在的子模块提交工作
  •   
  • 最后但并非最不重要这样可以在使用时启用断开操作   子模块,因为成功所需的所有提交" git submodule update -N"将自动获取。
  •   
     

因此我们选择此模式作为fetch和pull的默认模式。

git pull origin master --recurse-submodules 
git submodule foreach git pull origin master

第一个应该拉,而不仅仅是取,并等同于第二个。也许这是一个参数订单问题:

git pull --recurse-submodules origin master 

但是,不建议更新给定分支的子模块:请参阅以下部分。

请注意,实际从母版提取的正确方法是 register the master branch to the submodule ,使该子模块跟踪主文件:

git config -f .gitmodules submodule.<path>.branch <branch>

然后一个简单的git submodule update --remote --recursive就足够了 并且要获取/拉取的分支记录在父仓库中(在.gitmodules文件中),因此您甚至不必记住您希望子模块更新的分支。

更新Git 2.11(2011年第4季度)

  

有一个子模块,其中&#34; .git&#34;存储库在某种程度上是腐败的   导致一些命令直接递归到子模块循环。

commit 10f5c52Junio C Hamano (gitster)(2016年9月1日) Junio C Hamano -- gitster --合并于commit 293c232,2016年9月12日)

答案 1 :(得分:1)

  

使用--recurse-submodules有什么意义?

--recurse-submodules将在子模块中执行子模块(它实际上是递归)。 git submodule foreach git pull origin master不会,它只会执行直接的子模块。

相关问题