2009-12-14 173 views
57

当使用git checkout切换分支时,我会假定大部分时间您想要更新子模块。为什么git子模块在git checkout上不会自动更新?

  • 在什么情况下你不希望切换后更新子模块?
  • 如果这是通过git checkout自动完成的,会破坏什么?

已更新,例如:

  • 分公司A在3852f1
  • 科乙子模块S具有子模块S中fd72d7

在分支A,GIT中结帐乙将导致分支B的工作副本与子模块S在3852f1(带有修改的S)。 git子模块更新将在fd72d7结帐。

+2

相关:http://stackoverflow.com/questions/4611512/is-there-a-way-to-make-git-pull-automatically-update-submodules – philfreo 2011-01-06 03:41:18

+1

我同意你的意见。我正在与子模块项目工作,并在每次拉后我应该执行git子模块更新,但它在大多数时间是没有必要的。只有这样做的理由 - 当子模块之一实际更新时不要错过。 – 2011-02-04 08:39:25

回答

19

我相信子模块不会自动更新符合Git的开发目标。 Git旨在以分布式模式工作,并且不会假定您甚至无法连接到非本地存储库,除非您明确告诉它。当想到这种方式时,Git不会自动刷新子模块。如果你知道你总是希望这些子模块被引入,并且你知道你永远不会将这些子模块分支到另一个本地存储库,那么它不应该破坏任何东西,如果你结帐后自动刷新它们。

+37

我认为git checkout应该只是抱怨,如果子模块的提交不可用,而不是默认情况下将工作目录置于不一致的状态。然后你可以做git子模块更新来获取引用的提交。同样,通常提交将可用,并且结账可以在没有任何网络访问的情况下完成。接受你的答案,因为它听起来是合理的(但我不喜欢它) – serbaut 2009-12-14 15:25:34

+1

我第二个概念,git应该尝试做一个子模块初始化和更新初始结帐和抱怨,并显示状态如果存在一个子模块hasn'第一次被拉到当地。有了它之后,需要明确更新的概念才有意义,因为回购是不同的,并且子模块会引用特定的提交。但即使在分布式的世界里,它可能已经不可用了,你很可能会在某个时候想要它,并且git应该让你知道它从来没有被拉过。 – cclark 2012-02-01 01:08:35

+4

'git fetch'可以选择自动*提取*子模块,所以我认为结账应该有一个类似的选项来自动更新/签出子模块。 – 2014-06-23 13:48:01