如何管理DVCS中的公共库源?
目前,我的团队使用Perforce来管理我们的软件项目。使用Perforce的“工作区映射”功能,我能够轻松地将公共库源映射到开发应用程序目录,以保持源管理和开发项目工作之间的转换透明。例如,Repository看起来像这样:
由于漂亮的P4映射功能,我们的开发人员可以使用工作空间映射以最有意义的形式为他们所处理的项目提取一整套源代码。典型的dev项目文件夹可能如下所示:
/projects
/FALL-2009
/ForumSite
/deps
/event.logger
/json.parser
/AdminTool
/deps
/event.logger
/json.parser
/Users-db
/SiteConfiguration-db
/FALL-2009-PATCH-01
/json.parser
/SiteConfiguration-db
/FALL-2009-PATCH-02
/AdminTool
/deps
/event.logger
/json.parser
/SiteConfiguration-db
当在其任何组件或应用程序中编辑源代码时,更改将映射回正确版本点的正确源代码管理目录。这对开发者来说是透明的,降低了管理的复杂性和建立新项目的时间。
我正在研究Git,Bazaar和Mercurial作为Perforce的潜在替代品。任何人都可以深入了解DVCS世界中常见组件源的处理方式吗?
答案 0 :(得分:6)
在Git中,您可以使用git submodule
来实现此目的。
Git子模块存储为对来自另一个存储库的修订的引用,以及提供URL以查找其他存储库的文件。当您执行git submodule update
时,Git将克隆引用的存储库的副本(或者您可以将其配置为指向不同URL的同一存储库的不同副本,因为它是DVCS,因此任何克隆包含引用的修订版的存储库也可以工作),然后查看引用的修订版。
可悲的是,它并不像人们希望的那样无缝。检查父存储库中的新修订版实际上并未检出子模块;你需要做一个明确的git submodule update
来完成这个。我们已经尝试将git pull; git submodule update
包装为单个命令,但是还有很多其他命令(例如git rebase
)涉及检出文件,这些文件可能会使您进入混乱状态,因为它们不会更新子模块也是如此。一旦你熟悉子模块的工作方式,它就会全部解决,但它会产生一些摩擦。
答案 1 :(得分:4)
两天前以一种特殊的方式问了一个非常相似的问题:
How do people manage changes to common library files stored across mutiple (Mercurial) repositories?
现在Mercurial支持的Subrepo支持似乎是您设置的最佳选择。
答案 2 :(得分:2)
在Bazaar我使用插件scmproj,它允许我指定所需的组件配置,因此我可以提供实际分支与本地磁盘上的设置之间的任何映射,如您所述。
答案 3 :(得分:1)
我们正在使用git,并对其子模块功能非常满意。它允许您将其他git-repositories集成到当前的git-repositories中,当然还有修订版。我能看到什么,效果很好: - )