[有人请帮助我理解git中的子模块。我知道他们在Internet上受到了很多抨击,但是由于我认为git开发人员很聪明,所以一定有当前行为的原因-也许是解决我的问题的方法。
所以,我有一个项目和一些子模块。该项目有不同的分支,例如:
我的子模块不经常更新(也许每周一次),所以我对它们很好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进行原始提交的,并且我看不到除了原始提交所创建的子模块之外,您如何可能需要另一个子模块。
听起来好像您可以通过使用--recurse-submodules
的新git checkout
选项从git v2.13开始实现。从git-checkout
手册页:
通过使用:简化您的快捷方式/别名:
您基本上希望git对所有子模块进行递归自动执行所有操作。在像svn这样的集中式客户端-服务器模型中,这可能微不足道。