为什么`git checkout`不会自动执行`git submodule update --recursive`? [重复]

问题描述 投票:35回答:3

[有人请帮助我理解git中的子模块。我知道他们在Internet上受到了很多抨击,但是由于我认为git开发人员很聪明,所以一定有当前行为的原因-也许是解决我的问题的方法。

所以,我有一个项目和一些子模块。该项目有不同的分支,例如:

  • MyApp_version2
  • MyApp_version3
  • MyApp_version4
  • MyApp_liteversion
  • MyApp_development

我的子模块不经常更新(也许每周一次),所以我对它们很好not being attached to the head of the submodule repository automatically

但是,当我签出旧分支时-因为我需要修复软件旧版本中的错误-我还需要更新子模块。

为什么我需要这样做?

我希望git像svn一样工作。当我在主仓库中提交工作时,我希望git可以按照以下思路进行思考:“好,他想立即提交工作。我可以看到子模块当前处于abc版本,所以将来在某个时候回到此提交,他可能希望再次将子模块的版本更改为同一版本。“

我看不到一种情况,您希望子模块在主存储库中返回3年后仍保持当前版本。但是,必须有一个实现的理由,对吧?

我真的很想听听你们中是否有人知道这背后的想法,但是无论如何,我真的很想找到一个解决方案。有没有办法告诉git:“我想用这些子模块来提交这项工作。如果我在某个时候回到这种状态,我也希望以正确的版本检出子模块。”

澄清示例

我的主存储库是需要使用SSL的应用程序,并且找到了我添加为子模块的SSL库(libSSL)。

[2010年10月31日,我在主存储库(2fd4e1)中创建了一个提交,而子模块指向libSSL版本3(c67a2d)。

时间流逝,libSSl已更新到版本34,我适应了我的代码,生活得很好。

[2013年5月14日,我创建了一个新提交(28fced),并且子模块指向libSSL的最新版本(849ee1)。

但是,即使我最初的提交是使用c67a2d创建的,如果我签出2fd4e1,我的子模块也将停留在849ee1上。 Git知道我是使用c67a2d进行原始提交的,并且我看不到除了原始提交所创建的子模块之外,您如何可能需要另一个子模块。

git git-submodules
3个回答
28
投票

听起来好像您可以通过使用--recurse-submodules的新git checkout选项从git v2.13开始实现。从git-checkout手册页:


1
投票

通过使用:简化您的快捷方式/别名:


0
投票

您基本上希望git对所有子模块进行递归自动执行所有操作。在像svn这样的集中式客户端-服务器模型中,这可能微不足道。

© www.soinside.com 2019 - 2024. All rights reserved.