如何设置Git项目以包含其他项目?
例如.我正在开发一个在线地图应用程序.我们开发了一个GPS工具和SF装备.我们同时开发了一个Python Geomapping脚本以及一个不同的关注点(只关心地理映射).我们自己的核心文件将两者结合在一起,并为我们需要的应用程序构建它们.
每个项目必须独立存在 - 对GPS感兴趣的人只对GPS感兴趣 - 但包含所有其他项目的"父"项目必须作为项目可访问.
我花了一些时间试图理解子模块,但它们似乎对所需的东西有太多的独立性.
此外,如果可能的话,如果每个项目都包含一个或两个重叠的脚本,那就太好了.一个Git项目是否可以包含一个不属于其"root"的文件,这样当任何一个团队更新此文件时,两者都可以受益?
这对Git有用吗?Mercurial?主持人(GitHub,Gitorious)是否重要?
我有想法为'父'使用Subversion - 忽略.git文件夹,并使用Git作为项目(忽略.svn文件夹) - 但这只是最后的手段.
编辑:
解释为什么我不想要子模块:
用户下载时,zip不包含子模块(此处和此处).甚至当合作者试图设置项目时也是如此.这是一个节目塞子.
子模块被冻结 - 它们(不容易)获取正在指向的项目的最新版本.
其他原因如下面的奇妙答案和NoPugs的独白中所指出的那样.
子树合并(由Paul在下面介绍)不会这样做:很难从合并到的项目中更新[子树]源,并且该源必须位于"root"文件夹之外.该项目.作为一个Web应用程序,所有页面内部链接到其中的文件夹至关重要,并且测试和更新将直接在该文件夹中完成.(希望这对其他人来说是明确和有用的.)
仍在研究建立"远程分支",但其他想法仍然受欢迎.
我没有发现子模块对我所研究的(小)项目特别有用.一旦你设置了它们,处理整个项目需要为几乎每个命令添加额外的参数,并且语法不是完全规则的.我想如果我参与更多子模块的大型项目,我认为这是一个更有益的权衡.
将子项目作为独立的git repos保存到主(集成)仓库中有两种可能性:
使用子树合并 将外部项目放入 主仓库中包含核心文件的单独子目录中.这使得从外部项目更新主项目变得容易,但是将更改发送回外部项目很复杂.我认为这是一种包含项目依赖关系的好方法,但它对共享文件效果不佳. 另一个简单的解释(链接修复).
将每个项目设置为主仓库中的远程分支,并将它们从每个项目合并到master
包含核心文件的(集成)分支中.这需要一些纪律:如果您对主仓库中的外部项目进行任何更改,则必须在分支中进行更改,然后将其合并到主服务器中; 而且你永远不想融入项目分支.这使得将更改发送回外部项目变得很容易,并且在Git中使用分支是完全可以接受的.
您的共享脚本可以作为主目录中的另一个独立分支处理,外部合作伙伴可以将其作为远程分支进行处理.
如果你试图在同一个目录中运行SVN和Git,你就很难在任一系统中使用分支,因为SVN通过复制文件目录进行分支,而Git跟踪指针.两个系统都不会自动查看您在另一个系统中创建的分支.我认为"解决方案"比它的价值更麻烦.