请有人帮助我理解git中的子模块。我知道它们在互联网上受到了很多批评,但由于我认为git开发人员是聪明的人,所以当前行为必须有原因 - 也许有一种方法可以解决我的问题。
所以,我有一个项目和一些子模块。该项目有不同的分支,例如:
- MyApp_version2
- MyApp_version3
- MyApp_version4
- MyApp_liteversion
- MyApp_development
我的子模块更新不那么频繁(可能每周一次),所以我对它们不会自动附加到子模块存储库的头部感到满意。
然而,当我检出旧分支 - 因为我需要修复旧版本软件中的错误时 - 我也需要更新子模块。
为什么我需要这样做呢?
我希望git能像svn一样工作。当我在主repo中提交我的工作时,我希望git能够思考以下内容:“好的,他现在想提交他的工作。我可以看到子模块当前处于版本abc,因此当他在将来某个时间回到这个提交时,他可能还想要子模块再次处于相同的版本。”我无法看出任何情况下你会希望子模块停留在当前版本,而你在主代码库中回退3年。然而,肯定有实现这种方式的原因,对吧?
我真的很想知道你们中是否有人了解这背后的思路,但在任何情况下,我都希望得到解决方案。有没有一种方法可以告诉git:“我想提交这个工作和这些子模块。如果我在某个时刻回到这个状态,我也希望子模块被检出到正确的版本。”
澄清示例:
我的主代码库是一个需要使用SSL的应用程序,我找到了一个SSL库(libSSL),作为子模块添加。
在2010年10月31日,我在我的主代码库中创建了一个提交(2fd4e1),而子模块指向libSSL版本3(c67a2d)。
时间流逝,libSSL更新到34版本,我调整了我的代码,生活很美好。
2013年5月14日,我创建了一个新的提交(28fced),子模块指向最新版本的libSSL(849ee1)。
然而,如果我检出2fd4e1,我的子模块将停留在849ee1,即使原始提交是用c67a2d创建的。Git知道我使用c67a2d进行了原始提交,我不明白你为什么需要另一个子模块。
git checkout
也执行适当的子模块操作,但我不希望它默认启用... - twalberggit submodule init foo
应该类似于git clone foo
。如果用户想要执行比克隆或检出更复杂的操作,他可以只需cd foo
并正常调用 git。这可能会使所有这些晦涩的命令变得直观和易于使用。 - VinGarciagit checout
是一种本地操作。相比之下,git submodule update
(这就是--recurse-submodules
所暗示的)可能涉及到fetch
甚至clone
。因此,默认情况下这样做会从根本上改变checkout
的特性。我想这就是设计者们反对它的原因。您可以使用git config --global submodule.recurse true
更改默认行为。 - Lutz Prechelt