为什么git submodule在git checkout上不会自动更新?

ser*_*aut 69 git git-submodules

当使用git checkout切换分支时,我会假设您大多数时候都想要更新子模块.

  • 在什么情况下你想要的切换后更新子模块?
  • 如果这是由git checkout自动完成会破坏什么?

更新了示例:

  • 分支A的子模块S为3852f1
  • 分支B在fd72d7处具有子模块S.

在分支A上,git checkout B将导致分支B的工作副本,子模块S在3852f1(具有修改的S).git submodule update将在fd72d7结帐S.

Cir*_*四事件 25

git checkout --recurse-submodules 将被添加到git 2.13

发布说明中提到了这一点:https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139

submodule.recurse 选项被添加到git 2.14

设置:

git config --global submodule.recurse true
Run Code Online (Sandbox Code Playgroud)

man git-config 说:

指定默认情况下命令是否递归到子模块.这适用于具有--recurse-submodules选项的所有命令.默认为false.

  • `submodule.recurse`似乎从git 2.14开始工作。 (2认同)
  • 我将 `submodule.recurse` 设置为 `true`,但我发现仍然有一些时候(我认为在添加子模块时来回跳跃?)我必须执行 `git submodule update --init --在我的“git checkout”之后递归。有没有办法让它自动发生? (2认同)
  • 由于存在配置设置,因此他们应该默认启用它,并让任何(以某种方式)喜欢手动更新的人选择退出。 (2认同)

Aar*_*ron 24

我认为子模块不会自动更新符合Git的开发目标.Git旨在以分布式模式工作,并不假定您甚至能够连接到非本地存储库,除非您明确告诉它.当想到这种方式时,Git不会自动刷新子模块将是预期的行为.

话虽这么说,如果你知道你总是希望这些子模块被拉入并且你知道你永远不会将这些子模块分支到另一个本地存储库,那么如果你在之后自动刷新它们就不应该破坏任何东西.结帐.

  • 我认为如果子模块的提交不可用而不是默认情况下将工作目录保持在不一致状态,那么git checkout应该会抱怨.然后你可以执行git子模块更新来获取引用的提交.同样,通常提交将可用,并且可以在没有任何网络访问的情况下完成结账.接受你的答案,因为它听起来合理(但我不喜欢它;) (45认同)
  • `git fetch`有一个自动*获取*子模块的选项,所以同样我认为checkout应该有一个类似的选项来自动更新/ checkout子模块. (6认同)
  • *"当想到这种方式时,Git不会自动刷新子模块将是预期的行为."* - 我不明白为什么.实际上,我没有看到你的第一段中的任何一点与Git是否应该在拉动时自动尝试更新子模块有关. (3认同)
  • 我认为git应该尝试做一个子模块init并在初始检出时更新并且抱怨并显示状态是否存在第一次没有在本地拉出的子模块.一旦你需要显式更新的概念有意义,因为repos是不同的,并且子模块引用了一个特定的提交.但是即使在一个可能无法使用的分布式世界中,你很可能会在某个时候想要它,git应该让你知道它从未被拉过. (2认同)
  • 当您要在存储库上执行工作时,Git不会假定您始终有权访问从中签出的存储库。相反,一旦克隆,您的存储库就可以完全独立发挥作用。如果最初的假设是您仅在接到通知时才连接到外部存储库,那么结果就是Git不应自动刷新我试图传达的子模块。 (2认同)