Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Svn Mercurial-如何管理多个模块_Svn_Version Control_Mercurial - Fatal编程技术网

Svn Mercurial-如何管理多个模块

Svn Mercurial-如何管理多个模块,svn,version-control,mercurial,Svn,Version Control,Mercurial,我在一个使用Subversion的团队中工作,我们正在考虑切换到Mercurial 我们有多个具有唯一代码的独立项目,以及一些项目之间共享的代码。为简单起见,设想两个项目,SpaceGame和segame,它们都使用GraphicsEngine中的代码图形引擎的开发在某种程度上独立于游戏。假设我们需要从几个月前将SpaceGame更新为修订版467SpaceGame需要返回到版本467,GrpahicsEngine需要返回到它在SpaceGame处于467时的版本,GraphicsEngine不

我在一个使用Subversion的团队中工作,我们正在考虑切换到Mercurial

我们有多个具有唯一代码的独立项目,以及一些项目之间共享的代码。为简单起见,设想两个项目,
SpaceGame
segame
,它们都使用
GraphicsEngine
中的代码<代码>图形引擎的开发在某种程度上独立于游戏。假设我们需要从几个月前将
SpaceGame
更新为修订版467
SpaceGame
需要返回到版本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"}