Svn Mercurial-如何管理多个模块
我在一个使用Subversion的团队中工作,我们正在考虑切换到Mercurial 我们有多个具有唯一代码的独立项目,以及一些项目之间共享的代码。为简单起见,设想两个项目,Svn Mercurial-如何管理多个模块,svn,version-control,mercurial,Svn,Version Control,Mercurial,我在一个使用Subversion的团队中工作,我们正在考虑切换到Mercurial 我们有多个具有唯一代码的独立项目,以及一些项目之间共享的代码。为简单起见,设想两个项目,SpaceGame和segame,它们都使用GraphicsEngine中的代码图形引擎的开发在某种程度上独立于游戏。假设我们需要从几个月前将SpaceGame更新为修订版467SpaceGame需要返回到版本467,GrpahicsEngine需要返回到它在SpaceGame处于467时的版本,GraphicsEngine不
SpaceGame
和segame
,它们都使用GraphicsEngine
中的代码<代码>图形引擎的开发在某种程度上独立于游戏。假设我们需要从几个月前将SpaceGame
更新为修订版467SpaceGame
需要返回到版本467,GrpahicsEngine
需要返回到它在SpaceGame
处于467时的版本,GraphicsEngine
不能停留在最新版本。使用Subversion实现这一点的唯一方法是将所有项目放在一个大型存储库中(外部不会提供我们需要的行为)。这给我们的团队带来了很多问题;回购协议是巨大的,几乎没有人想对其进行全面结算,他们只结算他们需要的项目
使用Mercurial如何处理这种情况?这听起来像是一个使用Mercurial的用例 这意味着您可以将
GraphicsEngine
作为子存储库放入SpaceGame
(或者,如果您遵循,请创建一个包含
GraphicsEngine
和SpaceGame
以及子存储库的瘦“包装”回购)
子存储库的工作方式,SpaceGame
并不总是包含最新版本的GraphicsEngine
…它指向某个固定版本,如果同时更新了GraphicsEngine
,SpaceGame
不会自动获取这些更改……您必须进行显式更新才能获取这些更改。这意味着
SpaceGame
不会因为其他人对GraphicsEngine
的更改而意外中断
这也意味着(这就是您所问的)当您将SpaceGame
“从几个月前更新为修订版467”时,GraphicsEngine
子存储库
编辑: 不,
GraphicsEngine
仍然是一个单独的存储库,不为任何人“所有”。如果将其用作子存储库,则它只是从父存储库“链接”而来(并且可以从多个父存储库链接)。它仍然是一个单独的存储库 对于子存储库,类似这样的情况是可能的:
GraphicsEngine // main GraphicsEngine repo, current revision: 300
SpaceGame // main SpaceGame repo
└ GraphicsEngine // GraphicsEngine subrepo, current revision: 265
SeaGame // main SeaGame repo
└ GraphicsEngine // GraphicsEngine subrepo, current revision: 241
SpaceGame
和segame
都有一个GraphicsEngine
subrepo
每个子回购“指向”图形引擎的某个修订版(在我的示例中为265和241)。GraphicsEngine
的开发仍在继续(GraphicsEngine
的版本为300版),但最近的变化在SpaceGame
和segame
中看不到,因为它们都指向较旧的GraphicsEngine
版本。请注意:克里斯蒂安是对的,但我建议至少尝试一下,而不是次级回购,这是对一些次级回购局限性和缺点的回答
顺便说一句:
外表不会给我们所需要的行为
答案是错误的,是糟糕研究的结果。您可以通过两种不同的方式使用svn:externals,这两种方式(通过一些手工操作)都将为您提供所需的结果
类似次级回购的方式
图形引擎作为外部链接,定义中有固定版本。每次,当您必须在“SuperRepository”(带有外部的存储库)中使用更多新版本时,您必须更新外部定义并提交父项目。有了这样的硬链接,Superrepo总是为父外部定义了一对修订
免费链接,在时光倒流机中手动更新外部信息
如果您不想担心场景1中外部更新的监控(在定义的单个外部更新可以通过钩子自动进行的情况下),您可以使用外部,链接到GraphicsEngine的头部(定义中不使用修订),以手动(或通过某些脚本)更新包含外部数据的目录。我懒得写,所以只在这里写
使用首部链接,对于过去的主回购的版本N,外部必须处于版本M的状态,这是版本N时链接回购的最新版本。幸运的是,svn可以使用日期说明(不同形式)作为-r选项的参数。您只有确定提交N和更新externals dir的日期和时间(获取“混合修订工作副本”)
svn log-q-rn
在主回购协议中会给出
------------------------------------------------------------------------
r34 | lazybadger | 2012-03-24 12:28:12 +0600 (Сб, 24 мар 2012)
------------------------------------------------------------------------
现在只需记住日期字段“2012-03-2412:28:12+0600”
svn help up
确认我们可以使用日期作为修订说明符的内容
-r [--revision] ARG : ARG (some commands also take ARG1:ARG2 range)
A revision argument can be one of:
...
'{' DATE '}'
...
在“修订日期”一章中,我们将找到(日期-时间TZ)案例的正确格式
第一种格式对我们来说是最好的选择(因为我们已经从svn日志中获得了它),因此-我们可以在WC中使用externals(仍然没有与主版本同步)
并在相同的状态下获取外部,就像过去一样,主要修订版(在我的示例中)为34
PS:svn log…| gawk{…}
可以轻松提取和存储基本修订的日期时间
...
$ svn checkout -r {"2006-02-17 15:30 +0230"}
...
$ svn checkout -r {2006-02-17T15:30-04:00}
...
$ svn checkout -r {20060217T1530-0500}
cd EXTERNAL-DIR
svn up -r {"2012-03-24 12:28:12 +0600"}