2010-03-31 77 views
4

我倾向于使用来自Subversion的Mercurial,并且我想维护一个像Subversion一样的集中式工作流。这是我在想什么:这是一个很好的集中DVCS工作流程吗?

stable (clone on server) 
    default (branch) 
    development (clone on server) 
     default (branch) 
     bugs (branch) 
      developer1 (clone on local machine) 
      developer2 (clone on local machine) 
      developer3 (clone on local machine) 
     feature1 (branch) 
      developer3 (clone on local machine) 
     feature2 (branch) 
      developer1 (clone on local machine) 
      developer2 (clone on local machine) 

就分支机构与克隆而言,这个工作流程是否有意义?我有东西吗?

此外,'稳定'克隆是释放。 “默认”分支是否是发布以及所有其他分支最终被合并到了哪里?

回答

1

你在这里做的是建立一个workflow of merges,应该在仓库之后遵循仓库(分支)。

关于工作流,我会采取错误的分支/回购外发展,因为它通常是您隔离了一些bug修复

stable (clone on server) 
    default (branch) 
    bugs (branch) 
     developer1 (clone on local machine) 
     developer2 (clone on local machine) 
     developer3 (clone on local machine) 
    development (clone on server) 
     default (branch) 
     feature1 (branch) 
      developer3 (clone on local machine) 
     feature2 (branch) 
      developer1 (clone on local machine) 
      developer2 (clone on local machine) 

稳定后做了一个分支(即释放到生产)的分支,而不是全部错误修复最终将在开发分支中进行,因为其中一些修补程序仅针对当前版本进行了修改,而目前的开发可能已经使其过时。

是否有意义的'默认'分支是释放和所有其他分支最终合并到什么?

我也将使用第一个“默认”分支(稳定版的正下方)作为合并分支,因为不是每个功能将在合并分支结束:其中的一些目前开发的功能太复杂,无法及时准备下一个版本。

0

很大程度上取决于团队中的开发工作流程。在我工作的最后一个(小)团队中(我们使用svn) - 单独的bugs分支最终变得多余,错误在他们所属的分支中被固定。此外,我们没有单独使用stable分支,而是稳定了发行版的分支。

8

在Mercurial中,分支(在同一个存储库中使用hg分支创建)目前是不可逆的。一旦引入,您只能通过执行历史重写将它们从分支名称空间中移除。这就是为什么如果项目生命周期很短(只有少数功能分支)或分支足够通用以保持多年(如“稳定”,“错误修正”等),我才会创建真正的分支。据我所知,分支机构(和所有其他产品一样)在没有你的控制的情况下在本地创建,所以如果有人决定使用分支,该分支将在拉/推之后显示在主存储库中。

效果是 - 在你的结构 - 从发展拉入稳定后,你也会得到特征1特征2分支合并为稳定,是相当无用的。拉稳定发展因为你固定错误稳定版本也将合并分支错误发展。您可以尝试通过创建稳定库,将其克隆到发展,分公司特征1发展和拉发展稳定(提交这些步骤之间的一些变化):分支名字会与非活动的头出现在稳定虽然你它合并:

 
stable $ hg branches 
default      4:1c3cd0d1a523 
feature2      3:82879465c5f3 
feature1      2:5d7480426f21 (inactive) 
bugs       1:116860d2d85e (inactive) 

我记得,Git是能够删除分支,但水银有一定的发展能上的猫讨论这个话题;我不确定这是否仍然是最新的,所以如果我错了,请纠正我。

[编辑]根据Mercurial wiki中的Pruning Dead Branches,有4种方法可以“移除”一个分支。真正永久的唯一途径删除分支名称,而不仅仅是关闭(取消激活),它是通过用已清除的历史记录替换存储库。

从我所听到和看到的,使用Mercurial时创建克隆而不是分支更常见。我记得去年当我从SVN转到Mercurial时,和你有同样的想法。通常的做法与中央版本控制不同,因为分支可以在任何时候发生,而无需集中控制它,所以克隆是“分支”以不污染分支名称空间并保持开发分离和灵活的首选方式(您将始终检索完整的存储库,如果你拉/克隆包括所有分支机构,如果你只是想分支测试的东西,你将不得不选择一个独特的分支名称是永久性的,因此将出现在项目中的每个人)。尽管这种方法似乎浪费了磁盘空间,并且需要跟踪分支机构的位置(通常位于用户帐户和IDE内的某个项目文件夹中),但它似乎是一种更加灵活和实用的处理方式分支机构。 (它读取比当你真正自己使用它更困难)

已经有一些使用水银较小的项目,这是我们公司什么工作至今(每个项目只有几个活跃的开发者):

在服务器上:

项目名称,主要
发展被推到并从那里拉;这就是“权威”开发“分支”,以保持团队的库同步

项目名称稳定
如果一个版本得到释放/部署这就是- 主被推向;只有错误修正是在- 稳定的完成,然后拉回到- 主要:根据Mercurial Guide by Bryan O'Sullivan的建议,修正了被认为更稳定的版本(例如,以前的版本)通常可以撤回到开发分支中,但开发分支中的更改可能包含更新的不稳定功能,除非发布发布(或类似),否则不应将其拉入维护分支。

本地开发者的机器:

项目名称,主要克隆一次,正在处理和同步做一个拉(+合并),并定期推回服务器。

如果有一个功能“分支”需要我们克隆- 主(本地或服务器),并将其命名为克隆“项目名称 - featuredescription”。为了备份目的或集中式共享,我们还在服务器端创建一个克隆并推送到那里。如果要素是准备- 主,我们拉-featuredescription到我们当地- 主,合并更改,拉- 主从服务器,再次合并,推动- 主回服务器。如果变化发生- 主而我们在-featuredescription工作,我们可以很容易地从- 主拉和合并的变化(不推回- 主但因为我们不希望该功能在那里然而)。

与真正的分支相比,不利的一面是,在与父母合并后,您无法轻易识别出哪些变更集来自哪里。但是这对我们来说还没有问题(提交消息足够有用,或者一旦将特征分支与其父库进行合并,则特征分支的分离是无趣的)。

思考更大的项目我想出了以下应该工作的方案(但我还没有使用它)类似于集中版本控制。它依赖于对服务器端“权威”存储库的有限写访问,因此只有特权开发者(项目负责人)才可以合并并推送到那里。此外,还有一台CI服务器作为另一个存储库的网守- 主要测试的,它是- 主要的一个子集,仅包含CI批准的变更集,并略有延迟。

在服务器:

项目名称,主要
发展;只有少数人有写权限,主要变化需要由他们拉动;他们是在什么特征的分支合并

控制

项目名称,主要测试
发展;没有人应该在这里写,除非出现了问题,因为测试意味着持续集成系统,成功地建立了- 主推那个版本为- 主要测试,所以在这里的代码进行验证,不应该打破编译或测试

的projectname稳定
的projectname稳定测试
要稳定的 “分支” 相同的策略;和以前一样,我们推- 主上发布和bug修正工作,稳定版稳定版,测试是CI批准

当然,我们需要有多个仓库的地方在那里的球队/开发者实际上可以推动他们的日常工作,因为-主现在仅用于权威性更改(当然,他们可以完全在本地工作,但他们必须同步某处,如果他们不喜欢使用hg serve彼此同步或设置自己的服务器或关心备份)。

减少提交和存储库/分支的另一个选择是使用mq扩展来处理修补程序队列。但是,我发现使用克隆或分支更容易,至少对于小型项目来说。

相关问题