这是一个很好的集中式DVCS工作流程吗?

Cha*_*son 4 mercurial dvcs

我倾向于使用来自Subversion的Mercurial,我想维护一个像Subversion一样的集中式工作流程.这就是我的想法:

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)
Run Code Online (Sandbox Code Playgroud)

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

此外,'稳定'克隆是释放.将'默认'分支作为发布以及所有其他分支最终合并到什么内容是否有意义?

Ene*_*ant 8

在Mercurial中,分支(在同一存储库中使用hg分支创建)目前是不可逆转的.引入后,您只能通过执行历史记录重写从分支命名空间中删除它们.这就是为什么我只创建真正的分支,如果项目生命周期很短(只有几个功能分支)或分支通用足以保持当前多年(如"稳定","错误修复"等).据我所知,分支是(与其他一切一样)在本地创建而无法控制,所以如果有人决定使用分支,那么分支也会在拉/推后显示在主存储库中.

结果是 - 在你的结构中 - 从开发稳定之后,你也会将feature1feature2分支合并到stable中,这是非常无用的.拉的发展,因为你固定的错误在一个稳定的版本也将合并分支虫子进入发展.您可以尝试通过创建一个稳定的资源库,将其克隆到发展,分公司特征1的发展和拉发展稳定的(提交这些步骤之间的一些变化):分支名称将与非活动头出现稳定,虽然你它合并:

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

我记得Git能够删除分支,但Mercurial正在进行一些开发以追赶该主题; 我不确定这是否仍然是最新的,所以如果我错了请纠正我.

[编辑]根据Mercurial维基中的Pruning Dead Branches,有4种方法可以"移除"一个分支.只有这样,才能真正永久删除一个分支名,而不仅仅是关闭(取消),它是通过用清洁替代的历史资料库.[/编辑]

从我所听到和看到的情况来看,使用Mercurial时更常见的是创建克隆而不是分支.我记得去年我从SVN换到Mercurial的时候和你有过相同的想法.通常的方法与集中式版本控制不同,因为分支可以在任何时间发生而无需对其进行集中控制,因此克隆是"分支"以不污染分支命名空间并保持开发分离和灵活的首选方式(您将始终检索完整的存储库,如果你拉/克隆包括所有分支,如果你只想分支测试一些东西,你必须选择一个永久的独特分支名称,因此将显示给你项目中的每个人).虽然这种做法似乎是磁盘空间的浪费,你需要跟踪您的分支(平日里对您的用户帐户和里面的IDE的项目文件夹),这似乎是处理一个更加灵活和实用的方法分支机构.(它比您自己实际使用时更难阅读.)

有了许多使用Mercurial的较小项目,到目前为止这对我们公司有用(每个项目只有少数活跃的开发人员):

在服务器上:

projectname-main
开发正在被推进和拉动; 这是保持团队存储库同步的"权威"开发"分支"

projectname-stable
如果发布/部署版本,那么where -main被推送到; 只有错误修正在做稳定版,然后拉回-主:继从建议由Bryan奥沙利文水银指南,错误修正,以考虑更稳定的版本(例如,以前的版本),通常可以拉回开发分支,但变化开发分支可以包含更新,不稳定的功能,除非发布(或类似),否则不应将其拉入维护分支.

在开发者机器上本地:

projectname-main被克隆一次,通过拉(+ merge)进行处理和同步,并定期回送到服务器.

如果需要一个功能"分支",我们克隆-main(本地或从服务器)并命名克隆"projectname-featuredescription".为了备份或集中共享,我们还在服务器端创建了一个克隆并推送到那里.如果该功能已准备好-main,我们将-featuredescription拉入我们的local -main,合并更改,从服务器拉取--main,再次合并并将-main -main返回到服务器.如果变化发生-主,而我们在工作-featuredescription,我们可以很容易地从拉-主和合并的变化(不推回-主要还因为我们不希望该功能在那里还).

与真实分支相比的缺点是,在与父母之一合并后,您将无法轻易识别变更集的来源.但这对我们来说还不是一个问题(提交消息非常有用,或者一旦它们与父存储库合并,功能分支的分离就无趣了).

考虑到更大的项目我提出了以下应该工作的方案(但我还没有使用)类似于集中式版本控制.它依赖于对服务器端"权威"存储库的受限写入访问,因此只允许特权开发人员(项目负责人)合并并推送到那里.此外,还有一个CI服务器作为看门人到另一个仓库-主要测试它的一个子集-主只含有CI批准稍微延迟的变更.

在服务器上:

projectname-main
development; 只有少数人有写入权限,主要的变化需要由他们提取; 他们控制着哪些功能分支合并

projectname-main-tested
开发; 没有人应该在这里写,除非出现了问题,因为测试指的是持续集成系统,成功地建立了-主推的是修订成-主要测试,所以在这里的代码进行验证,不应该打破编译或测试

projectname-stable
projectname-stable-tested
用于稳定"分支"的策略; 和以前一样,我们推-main稳定版的发布和bug修正上工作,稳定版,测试是CI批准

当然,在某个地方需要有多个存储库,团队/开发人员实际上可以将他们的日常工作推向现在-现在只能进行权威性更改(当然,他们可以完全在本地工作,但如果他们不喜欢,他们必须在某处同步使用hg服务或建立自己的服务器或关心备份来彼此对等).

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