我有一个dotfiles存储库,其中所有的vim插件都存储为子模块,因此在更改时很容易更新。我认为这两个命令做了同样的事情,但我注意到情况绝对不是这样。
我知道我有几个子模块的更新,所以我从父存储库的根目录运行git pull origin master --recurse-submodules
。它似乎迭代每个子模块,但只从其原始存储库获取更新。
当我运行git submodule foreach git pull origin master
时,它实际上在每个存储库中运行git pull origin master
,同时执行获取和合并。
使用--recurse-submodules
有什么意义?我对它实际上要做的事情感到有点困惑,谷歌对我发现的东西有点神秘。我想也许你聪明的人会有一个更简单的解释。
答案 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 10f5c52见Junio 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
不会,它只会执行直接的子模块。