2010-07-12 60 views
11

水银科库我试图确定人们如何使用“分支库”,同时还使用subrepos。与SUBREPOS

比方说,我有回购含有溶液文件(.NET)主,并用subrepos A,B,C填充:

/Main 
    - A 
    - B 
    - C 
    MainSolution.sln 

A,B,和C,同时彼此之间共享的“主“回购,与主项目紧密结合。因此,Main repo的一个主要特点是需要修改subrepos(即它们是共享库,但是非常积极地开发)。

现在是时候添加一个功能。这个功能对于一个人来说太大了,因此需要将代码推送到中央仓库,以便其他人可以提供帮助。在功能开发开始之前,我们还需要能够回到最后的“稳定”代码,以防需要修正错误。我相信我现在有两个选择:(1)在Main repo中创建一个命名分支,或者(2)创建一个Main的新克隆。由于存在次要问题,所以这两种选择都会产生不典型的影响。

选项1)我认为创建一个命名分支允许修改subrepos被提交/推送,但是只有其他更新到该分支的人也会受到影响。跟踪hgsubstate文件。然而,subrepos将获得新的头部,因此(可能)实验性特征最终会被推到中央回购站。我是否正确理解这一点?

选项2)“不要使用命名分支,使用'分支库'”,它们实际上是主要回购的克隆,但名称不同,并且存在于中央服务器上。这对我来说有点吸引力,因为它似乎让事情分开了(因此脱离了灾难,因为同事和我自己都在学习Mercurial)。但是当涉及子库时,这个工作流看起来完全被破坏了,因为创建Main repo的克隆不会创建subrepos的新的,分离的克隆。这是一个新的克隆,但它仍然指向同一个subrepos,因此对它们所做的更改将会找回到subrepos!我意识到这是设计,这对于Mercurial来说是非常酷的事情之一(对我来说)。但是人们究竟如何将这个分支库工作流与子库一起使用呢?完全不可思议的是,对于每个功能/实验/版本/无论如何,我要在Main repo上创建一个新的克隆(在中央服务器上),并创建subrepos的克隆(在中央服务器上),以及AND修改所有.hgrc/.hgsub路径以指向适当的中央回购站。

在这一点上,我只是想了解人们对一项复杂的工程工作,并使用带有分支库subrepos。有什么想法吗?

回答

1

我宁愿为将最有可能最终会合并到默认的分支部件命名的分支。切换分支比切换回购更容易。

与你永远不必担心意外推你发展的不稳定分支进入稳定回购命名的分支。指定的分支已经存在,但除非开发人员要求,否则不会通过更新进行检索。

+0

两件事。 当你说一个命名分支将不会被retreived,除非一个开发人员要求它,你的意思是dev的工作副本不会被修改,除非该分支已签出,或者你指的是其他东西?这是我的理解,所有分支都自动推/拉。 此外,根本问题并不是关于是否使用命名分支vs分支回购,而是在使用子库时如何使用分支存储库。 但谢谢你的回应! – Andrew 2010-07-17 23:17:47

+0

命名分支将以“hg pull”进行检索,但开发人员的工作目录不会更新到不同的分支,而不会明确更新为 “hg up -r ”。 在我看来,最好的路径是开发人员最难解决的问题。当单独的分支仓回收意外推到一起时发生的“瓶外精灵”问题使我相信,单个回购仓中的命名分支更可取。因人而异。 不可否认,我可能错过了subrepos中增加的一些复杂性。祝你好运! – 2010-07-19 16:14:17

+0

任何人都可以点亮一下@MarkB在这里描述的“瓶子里的精灵”场景吗? – 2012-10-09 17:15:13

3

您有其他选择。例如,您可以使用书签。自1.9版以来,书签可以被推送和拉出,它们不仅仅局限于本地。由于在完成新功能之后,您通常不希望开发“分支”作为命名分支继续使用,因此书签往往是更好的选择。我倾向于使用书签进行新的开发,并为发布的版本保存真正的分支。

您还应该注意,子库不需要已按照您描述的方式在多个主要存储库之间共享。实际上,您可以将的子存储库存储在的主存储库中(而不是将它们与主要存储库放在同一级别,或完全存储在其他某个位置),这将使其为每个主存储库唯一的,但当您想要分享这些更改时,您可以从其他主要回购站的subrepos中推拉。我通常这样做。

不幸的是,这很难解释,如果没有白板,请告诉我是否不清楚。

相关问题