2010-04-07 86 views
12

好的,所以我们最近从SVN转换为Mercurial。
我们通常使用TortoiseHG。

在我们的一个存储库中,我们有我们所有的项目,C++/.NET/ASP。我们有大约100个项目,都使用共同的图书馆项目。

因此,为每个项目创建多个回购将是相当困难的任务。

现在,我们有default分支,并且让我们说branchA
我正在BranchA并加入我的尤伯杯改变它,我改变一个公共库,让我们说的扩展方法
Mercurial仅合并某些更改集

我要提交这branchAdefault,我将如何去这件事吗?

不过,我不希望我的branchA所有更改合并到default,我不想从default

所有其他变化但愿这是足够的信息!

+2

这是使用版本控制来管理项目的错误方法。如果你有一个库在多个项目之间共享,库应该有它自己的库。从长远来看,手动处理这样的变化会导致你无尽的问题。 – 2011-06-20 04:27:48

+0

@PeterGraham mega-repos用于非常大的公司,如[Facebook](https://code.facebook.com/posts/218678814984400/scaling-mercurial-at-facebook/),取得了很好的成功。 – Fowl 2016-01-06 07:16:36

回答

11

有一种方法可以避免这个问题。您可以make all your changes on separate feature branches from some baseline revision,通常是最新版本的标签或其他稳定点S

这样,你的变化X将在自己的分支,它可以与其他分支(合并M1M2)不引入不必要的变更合并:

-----S--o----o---M1----o---> default 
    |  /
    |---------X feature or bugfix 
    |   \ 
    \--o---o----M2----o-----> BranchA 

这只需要正常hg merge操作;不需要补丁,TransplantMQ

-1

您正在描述“樱桃采摘”或进行“部分合并”,而Mercurial目前无法实现这种合并。您有几个选项:

  • 将您的通用代码分隔到自己的存储库中。
  • 生成您对通用代码所做更改的差异,并将其应用于default分支。
+0

Downvoted,因为mercurial支持樱桃采摘。 Mercurial称之为“移植”,它可以使用移植扩展。 – 2011-06-20 04:22:28

5

如果将通用代码分隔到自己的存储库中,则可以使用subrepos将其包含在每个项目中。

顺便说一句,我建议为每个项目有一个单独的存储库,特别是如果有这么多。

22

只是为了保持一点点更新:有一个graft command实现在Mercurial樱桃采摘。

此命令使用Mercurial的合并逻辑从其他分支复制个别更改 而不合并历史图中的分支。 这有时被称为'backporting'或'cherry-picking'。默认情况下,嫁接将从源 变更集复制用户,日期和描述。