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

2023-11-24

我有一个 dotfiles 存储库,其中所有 vim 插件都存储为子模块,因此在发生更改时很容易更新。我以为这两个命令做了同样的事情,但我注意到事实并非如此。

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

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

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


该选项主要是为了fetching所有子模块提交,而不仅仅是拉取像 master 这样的一个特定分支,原因在以下两个提交中详细说明:
(请注意,Git 2.11 中修复了一个错误,请参阅本答案的末尾)

For git pull,此选项已在 (提交 7dce19d,2010 年 11 月,git 1.7.4-rc0):

fetch/pull:添加--recurse-submodules option

直到现在你还得打电话“git submodule update“ (没有-N|--no-fetch选项)或类似“git submodule foreach git fetch" 从远程获取已填充子模块中的新提交。

这可能会导致“(commits not present)" 输出中的消息 ”git diff --submodule“(由“使用”git gui" and "gitk“) 后 在超级项目中获取或拉取新的提交,这是一个障碍 实现子模块的递归检出。
Also "git submodule update“断开连接时无法获取更改,因此很容易忘记在断开连接之前获取子模块更改,只是后来才发现需要它们。

该补丁添加了“--recurse-submodules" 递归获取的选项 从配置的 url 中每个填充的子模块.git/config的 每个“末尾的子模块git fetch“或期间”git pull“ 在里面 超级项目。子模块路径取自索引。


提交 88a2197(2011 年 3 月,git 1.7.5-rc1)多解释一下:

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

为了能够访问由引用的填充子模块的所有提交 超级项目,只需让“git fetch“ 递归成 当在超级项目中获取新提交时的子模块记录新 并为此做出承诺。

  • 使用“时”时,存在这些提交非常有用--submodule“ 选项 ”git diff"(这就是“git gui" and "gitk“自 1.6.6 起执行),因为创建一个子模块所需的所有子模块提交 可以访问描述性输出。
  • Also 合并子模块提交(在 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 

但是,这不是更新给定分支的子模块的推荐方法:请参阅以下部分。


请注意,实际从 master 拉取的正确方法是将主分支注册到子模块,使该子模块跟踪主模块:

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

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


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

有一个子模块,其“.git“ 存储库不知何故已损坏 导致一些命令永远递归到子模块循环中。

See commit 10f5c52 (01 Sep 2016) by Junio C Hamano (gitster).
(Merged by Junio C Hamano -- gitster -- in commit 293c232, 12 Sep 2016)

This last 2016 commits is expended with With Git 2.21 (Q4 2018): "git fetch --recurse-submodules"(man) may not fetch the necessary commit that is bound to the superproject, which is getting corrected.

See commit be76c21 (06 Dec 2018), and commit a62387b, commit 26f80cc, commit d5498e0, commit bcd7337, commit 16dd6fe, commit 08a297b, commit 25e3d28, commit 161b1cf (28 Nov 2018) by Stefan Beller (stefanbeller).
(Merged by Junio C Hamano -- gitster -- in commit 5d3635d, 29 Jan 2019)

submodule.c:在子模块 git 目录中获取而不是在工作树中获取

Signed-off-by: Stefan Beller

保留引入的属性10f5c52656 ("submodule:避免自动发现prepare_submodule_repo_env()”,2016-09-01,Git v2.11.0-rc0 --merge列于batch #1),通过固定git子模块的目录。

But... "git fetch"(man) did not work correctly with nested submodules where the innermost submodule that is not of interest got updated in the upstream, which has been corrected with Git 2.30 (Q1 2021).

See commit 1b7ac4e (12 Nov 2020) by Peter Kaestle (dscho).
(Merged by Junio C Hamano -- gitster -- in commit d627bf6, 25 Nov 2020)

submodules:修复了获取非 init subsub-repo 时的回归问题

Signed-off-by: Peter Kaestle

回归已被引入a62387b ("submodule.c: 在子模块 git 目录中获取而不是在工作树中获取", 2018-11-28, Git v2.21.0-rc0 --merge列于batch #4).

它触发的场景是当一个远程存储库在子存储库内有一个子存储库时,如下所示:superproject/middle_repo/inner_repo

A 和 B 都有它的克隆,而 B 没有使用它inner_repo因此没有在他的工作副本中初始化它。

现在 A 提出了一个改变inner_repo并通过middle_repo和超级项目。

Once person A pushed the changes and person B wants to fetch them using "git fetch"(man) on superproject level, B's git(man) call will return with error saying:

无法访问子模块'inner_repo' 子模块获取期间出错:> middle_repo

Expectation is that in this case the inner submodule will be recognized as uninitialized subrepository and skipped by the git fetch(man) command.

这在之前可以正常工作'a62387b ("submodule.c: 在子模块 git 目录中获取而不是在工作树中获取", 2018-11-28, Git v2.21.0-rc0 --merge列于batch #4)'.

从...开始a62387b代码想要评估"is_empty_dir()“ 里面.git/modules对于仅存在于工作树中的目录,当然会提供错误的返回值。

此补丁恢复了以下更改a62387b并引入回归测试。


Warning: An earlier attempt to fix "git fetch --recurse-submodules"(man) broke another use case; revert it with Git 2.30 (Q1 2021), until a better fix is found.

See commit 7091499 (02 Dec 2020) by Junio C Hamano (gitster).
(Merged by Junio C Hamano -- gitster -- in commit f3e5dcd, 03 Dec 2020)

Revert "submodules:修复了获取非 init subsub-repo 时的回归问题”

This reverts commit 1b7ac4e6d4d490b224f5206af7418ed74e490608 Ralf Thielow reports that "git fetch"(man) with submodule.recurse set can result in a bogus and infinitely recursive fetching of the same submodule.


With Git 2.30.1 (Q1 2021), "git fetch --recurse-submodules"(man) fix (second attempt).

See commit 505a276 (09 Dec 2020) by Peter Kaestle (dscho).
(Merged by Junio C Hamano -- gitster -- in commit c977ff4, 06 Jan 2021)

submodules:修复了获取非 init subsub-repo 时的回归问题

Signed-off-by: Peter Kaestle
CC: Junio C Hamano
CC: Philippe Blain
CC: Ralf Thielow
CC: Eric Sunshine
Reviewed-by: Philippe Blain

回归已被引入a62387b ("submodule.c: 在子模块 git 目录中获取而不是在工作树中获取", 2018-11-28, Git v2.21.0-rc0 --merge列于batch #4).

它触发的场景是当一个存储库的子模块内有一个子模块时,如下所示:superproject/middle_repo/inner_repo

A 和 B 都有它的克隆,而 B 没有使用它inner_repo因此没有在他的工作副本中初始化它。

现在 A 提出了一个改变inner_repo并通过middle_repo和超级项目。

Once person A pushed the changes and person B wants to fetch them using "git fetch"(man) at the superproject level, B's git call will return with error saying:

无法访问子模块'inner_repo' 子模块获取期间出错: 中间仓库

期望在这种情况下,内部子模块将被识别为未初始化的子模块并被git fetch命令。

这在之前可以正常工作'a62387b ("submodule.c: 在子模块 git 目录中获取而不是在工作树中获取", 2018-11-28, Git v2.21.0-rc0 --merge列于batch #4)'.

从...开始a62387b代码想要评估"is_empty_dir()“ 里面.git/modules对于仅存在于工作树中的目录,当然会提供错误的返回值。

该补丁可确保is_empty_dir()通过连接实际工作树和未初始化子模块的名称来获取未初始化子模块的正确路径。

修复此回归的第一次尝试是1b7ac4e ("submodules:修复获取非 init subsub-repo 时的回归问题”,2020-11-12,Git v2.30.0-rc0 --merge列于batch #8),通过简单地恢复a62387b,在具有未初始化子模块的超级项目的递归获取的更简单情况下导致子模块获取的无限循环,因此此提交被还原7091499(恢复 ”submodules:修复获取非 init subsub-repo 时的回归问题”,2020-12-02,Git v2.30.0-rc0 --merge列于第 10 批).
为了防止将来出现损坏,还要为此场景添加回归测试。


"git fetch --recurse-submodules from``"(man) multiple remotes (either from a remote group, or "--all") used to make one extra "git fetch"(man) in the submodules, which has been corrected with Git 2.37 (Q3 2022).

See commit 0353c68 (16 May 2022) by Junio C Hamano (gitster).
(Merged by Junio C Hamano -- gitster -- in commit fa61b77, 25 May 2022)

fetch:不要从子模块运行冗余提取

Reviewed-by: Glen Choo

When 7dce19d ("fetch/pull:添加--recurse-submodules选项”,2010-11-12,Git v1.7.4-rc0 --merge)引入了“--recurse-submodule”选项,所采取的方法是在所有主要提取之后仅在子模块中执行一次提取(通常可能是从单个远程提取,但也可能是从一组远程提取)遥控器使用fetch_multiple())成功了。
后来我们添加了“--all”来从所有定义的遥控器中获取数据,这使事情变得更加复杂。

If your project has a submodule, and you try to run "git fetch"(man) --recurse-submodule --all, you'd see a fetch for the top-level, which invokes another fetch for the submodule, followed by another fetch for the same submodule.
All but the last fetch for the submodule come from a "git fetch --recurse-submodules"(man) subprocess that is spawned via the fetch_multiple() interface for the remotes, and the last fetch comes from the code at the end.

因为从子模块递归获取是在每次获取顶层时完成的fetch_multiple(),子模块中的最后一次获取是多余的。
只有当fetch_one()与顶层的单个遥控器交互。

当我们这样做时,在处理一组远程时存在一个优化,但当“--all“ 用来。
在前者中,当群体变成一个群体时,而不是产卵”git fetch“ 作为子进程通过fetch_multiple()界面,我们使用普通的fetch_one()代码路径。
递“时也做同样的事”--all”,如果事实证明我们只定义了一个远程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“git submodule foreach git pull origin master”和“git pull origin master --recurse-submodules”有什么区别 的相关文章

  • Python递归限制与堆栈大小?

    我了解递归中每个递归调用如何堆栈在堆栈上 如果超出堆栈限制 则会出现堆栈溢出 那么为什么Python的sys getrecursionlimit 返回一个数字 递归调用的最大深度 这不取决于我在该递归函数中所做的事情吗 或者它是否以某种方式
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • Python 递归和列表

    我正在学习 python 中的递归 我有以下代码 def search l key locates key in list l if present returns location as an index else returns Fal
  • 尽管有 svn 复制,如何 git svn 克隆完整历史记录

    在我的公司 我们即将从 svn 切换到 git 我们使用的 SVN 非常大 没有 svn 布局 并且在每个版本拆分上我们都制作了一个 svn 副本 SVN存储库结构 svnserver company de product xy 主要版本号
  • 在 git 提交消息中使用任何 utf-8 字符是否安全?

    我发现使用 UTF8 字符 例如 很有用 请参阅here http www utf8icons com subsets dingbats 在提交消息中 重构 NewService 添加了更好的服务 OldServiceA 据我所见 它see
  • 如何使用 libgit2 创建空提交?

    我一直在寻找libgit2 C API 参考 https libgit2 org libgit2 但我不知道如何模仿git commit allow empty libgit2 是否有内置方法来创建空提交 如果没有 git 如何在底层创建一
  • web2py git 集成 - localhost 和 pythonanywhere

    我完全不知道如何将 Github 集成到 web2py 中 我在 USB 上安装了 web2py任何地方的Python http www pythonanywhere com web2py概述文档chapter3http web2py co
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 使用 Python 的“哈密尔顿”路径

    我正在尝试使用 Python 实现遍历所有图顶点的任意路径 不一定是循环 的递归搜索 这是我的代码 def hamilton G size pt path if pt not in set path path append pt if le
  • Git refs/remotes/origin/master 没有指向有效的对象

    在上次合并到 Git 存储库的 master 分支后 我失去了克隆存储库的能力 Cloning into test repository remote Counting objects 126084 done remote Compress
  • 使用 Subversion 进行部分提交

    鉴于我做的案例两个独立的变化 in one文件 例如 添加了一个新方法并更改了另一个方法 我经常不想提交这两项更改 因为one提交 但作为two独立承诺 在 git 存储库上我会使用互动模式 of git 添加 1 http linux d
  • 获取嵌套数组 JS 中对象的所有父对象

    我在使用 vuejs 的项目上遇到问题 我有一个像这样的嵌套对象数组 Data data id 1 parent id null title First folder children id 3 parent id 1 title Firs
  • 本地git,推送到tfs远程repo

    我厌倦了向我的队友解释使用 DVCS 相对于 CVCS 的好处 他们中的一些人害怕学习曲线 另一些人则看不出任何原因 因为对他们来说 这都是一样的 就我个人而言 我对 TFS 及其问题感到非常厌倦 每当我需要进行一些小的 修复 时 我都必须
  • EGit(Eclipse git 插件)可以使用 SSH 密钥代替用户名和密码吗?

    我需要提交的 git 中央存储库是使用 SSH 密钥配置的 我的用户名是jmglov 但是当我执行 git 操作时 例如git clone 我使用这个配置 jmglov kitiara cat git config remote origi
  • 如何使用 sourceTree 进行推送?

    我正在使用 sourceTree 管理 Unity 项目 版本 4 6 3 我只是想返回到上一次提交 右键选择 将当前分支重置到此提交 在使用模式中选择 硬 然后放回上一次提交 之后 我尝试去推 但没有成功 抱歉 当时我忘记了错误 之后 我
  • 返回到存储库中的特定修订后提交并推送更改?

    我们需要及时返回到某个特定的提交 一些意外的改变是为了掌握 尝试恢复它挖得太深 所以 master 的状态很糟糕 现在我们希望master回到66ada4cc61d62afc 根据git 恢复到某个提交 https stackoverflo
  • 如何使用 vim 作为“git show”编辑器?

    全部如所述如何使用 vim 作为 git log 编辑器 https stackoverflow com questions 16666009 how do i use vim as git log editor不适用于 git show
  • 从 github 中删除子项目提交

    我有两个存储库A and B 我错误地在我的机器上将仓库 B 克隆到了 A 内 我从存储库 B 中删除了所有代码 但是当我在源上从 A 推送并合并代码时 它还显示了子项目提交B在 Github 仓库上 我想从我的 master 上删除子项目
  • 按时间顺序将多个文件夹提交到 git 中

    我有数百个网站备份 每个文件夹一个 我想将它们放入 git 存储库中 每个备份作为一个版本 这些变化主要涉及图像文件和每天 2 个数据库备份 大小约为 25 GB 并且不断增加 有没有办法告诉 git 获取其中一个文件夹并将其提交到存储库中
  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa

随机推荐

  • Backbone.js:过滤集合的正确方法?

    我当前使用的方法是过滤一个集合 它返回一个数组 然后使用 collection reset array 重新填充它 但是 这会修改原始集合 因此我添加了一个名为 originalCollectionArray 的数组 它跟踪集合的初始数组状
  • 为什么将 ArrayList 的泛型转换为超类不起作用?

    有人可以向我解释一下为什么标记该行吗 this line gives a compile error why 在下面的代码示例中不起作用 import java util ArrayList public class GenericCast
  • NLTK 正则表达式标记生成器在正则表达式中不能很好地处理小数点

    我正在尝试编写一个文本规范化器 需要处理的基本情况之一是像3 14 to three point one four or three point fourteen 我目前正在使用该模式 d d with nltk regexp tokeni
  • 查找两个字符串之间的相似度度量

    在Python中如何获得一个字符串与另一个字符串相似的概率 我想要得到一个十进制值 如 0 9 意味着 90 等 最好使用标准 Python 和库 e g similar Apple Appel would have a high prob
  • 使用 Ruby 将大文件上传到 S3 失败并出现内存不足错误,如何分块读取和上传?

    我们通过 Ruby AWS SDK v2 从 Windows 计算机将各种文件上传到 S3 我们已经使用 Ruby 1 9 进行了测试 我们的代码工作正常 除非遇到大文件 抛出内存不足错误 首先 我们使用以下代码将整个文件读入内存 body
  • 是否有用于双精度倒数平方根的快速 C 或 C++ 标准库函数?

    我发现自己打字 double foo 1 0 sqrt 很多 而且我听说现代处理器具有内置的反平方根操作码 是否有 C 或 C 标准库的反平方根函数 使用双精度浮点数 准确度为1 0 sqrt 与结果一样快或更快1 0 sqrt 不 不 没
  • 在经典 ASP 中对集合进行排序

    这是一个非常简单的问题 如何对集合进行排序 我有一个 CSV 文件 其中的行按随机顺序排列 我想根据一列中的日期对行进行排序 我是否将行添加到记录集中 我可以使用 Scripting Dictionary 进行排序吗 显然我已经被 NET
  • 字体大小的默认单位?

    网上的各种文本声称 pt 是默认的字体大小单位 当没有提供时 但是 我自己的测试似乎证明并非如此 我读过许多关于 W3C 的文档 涵盖 CSS 1 3 的字体大小 但我似乎无法在任何规范中找到对默认单位的实际引用 我在 Chrome 和 I
  • 阻止 PHP 解析非 PHP 文件,例如 someFile.php.txt

    我刚刚安装了 phpdocumentor 但收到了奇怪的错误 我终于找到了问题所在 Phpdocumentor 创建各种文件 例如 someFile php txt 其中包含 PHP 代码 但不打算进行解析 事实证明 我的服务器正在解析它们
  • 如何更改 Bootstrap 4 上的导航栏悬停颜色?

    我需要将导航栏悬停颜色更改为其他颜色 我设法自己更改导航栏文本颜色 但在检查元素的悬停颜色中找不到要更改的正确颜色 然后我在堆栈溢出上查找了以前的答案 但它们对我的代码不起作用 任何投入将不胜感激
  • C 函数调用中的默认参数提升

    Setup 我对在 C 中调用函数时的默认参数提升有几个问题 这是第 6 5 2 2 节 函数调用 第 6 7 和 8 段C99 标准 pdf 为了便于阅读 添加了重点并分成列表 第 6 段 如果表示被调用函数的表达式的类型为不包括原型 对
  • Double 到 String 保持尾随零

    我尝试将双精度值转换为字符串并使用Replace 方法 将 替换为 这很好用 但只有当尾随数字不为零时 我的字符串中才需要零 即使该值为 1234 0 0 这对于十进制值效果很好 我尝试将双精度数转换为十进制数 但如果有零 我会丢失小数位
  • 调用 CallVoidMethod 时 JNI 崩溃

    我正在尝试从 Android 应用程序中的本机 C 代码调用 java 方法 使用 JNI 听起来很简单 但我的代码在最终调用方法本身时总是崩溃 这是我的代码 本机 C 代码 JNIEXPORT void JNICALL Java com
  • 如何更改 XAMPP 中 PHP 的默认路径?

    我正在使用 xampp 来部署 Web 应用程序 它将 PHP 模块包含在一个包中 现在我想做的是更改 PHP 的默认路径 以便我可以使用其他版本的 PHP 而无需覆盖现有模块 我的新 PHP 副本存在于桌面上 如何配置 Apache 以引
  • 将 JPanel 上的组件置于前面 (Java)

    在VB中 您可以使用zOrder 在 Net中 它是 SetChildIndex 在你问之前 不 在这种情况下我没有使用布局管理器 如果您有两个叠在一起的组件 那么在它们已经显示之后如何更改顺序 由于空间不足 我有一个按钮稍微重叠在另一个组
  • 与 Windows 10 相比,Android 模拟器在 ubuntu 17.04 上运行速度极慢

    我尝试从此链接安装 kvm https help ubuntu com community KVM Installation 但即使在尝试此操作之后 模拟器在软件 GLES 2 0 模式下运行时仍然很慢 并且当我选择硬件 GLES 2 0
  • (默认)为每个可变参数类型构造一个对象

    考虑这个代码片段 void Foo std string str1 std string str2 template
  • IE10 setInterval 内存泄漏的解决方法

    在测试我们的 Javascript 库期间 我认为我们在 IE10 v10 0 9200 16519 Windows 8 64 位 Javascript 实现中发现了严重的内存泄漏setInterval 一个简单的测试用例表明 如果在函数的
  • SQL - 源代码控制和架构/脚本管理

    我的公司刚刚完成年度审核流程 我终于说服他们 是时候找到更好的解决方案来管理我们的 SQL 模式 脚本了 目前 我们只有几个脚本需要手动更新 我曾在另一家公司使用过 VS2008 数据库版本 这是一个很棒的产品 我的老板让我看一下 Redg
  • “git submodule foreach git pull origin master”和“git pull origin master --recurse-submodules”有什么区别

    我有一个 dotfiles 存储库 其中所有 vim 插件都存储为子模块 因此在发生更改时很容易更新 我以为这两个命令做了同样的事情 但我注意到事实并非如此 我知道我有几个子模块需要更新 所以我跑了git pull origin maste