具有多个私有实体贡献的项目版本控制组织

时间:2015-02-06 17:23:34

标签: mercurial bitbucket

我正在寻找有关如何最好地组织以下所述环境的建议。我们目前使用的是Mercurial,我更愿意留在那里,但如果不同的版本控制系统可以帮助我们实现目标,我们将会切换。

简短摘要 - 我们公司一直在与另一家公司签订合同以进行工作。我一直在从我们的共享存储库合并到我们的私有存储库,在那里我们进行了其他修改,并从那里构建了一个发布产品。现在我们想增加2个承包商(他们是整个公司,而不仅仅是一个人),也可以贡献,但是所有承包商都有我能看到的私人信息,但需要私人信息来自其他承包商。

更多详情:

ContractorA启动了存储库 我将ContractorA分叉到MyCompany

MyCompany现在包含对ContractorA的补充

到目前为止我处理这个问题的方式是:

ContractorA推送到ContractorA 我的本地计算机有MyCompany的克隆 我在本地机器上有一个ContractorA的别名 我从ContractorA拉出,处理任何合并冲突,然后推送到MyCompany

因此,MyCompany仓库包含了ContractorA和MyCompany的所有更改

这已经完全满足我的需求,但现在ContractorB将进入图片

ContractorA拥有ContractorB无法访问的专有资料,ContractorB拥有承包商A无法访问的专有资料。

ContractorA将提供一个共同的部分,MyCompany和ContractorB将使用。

所有内容都需要在MyCompany中结束,因为我们会做一个包含所有内容的构建 - ContractorA修改的常用代码 ContractorA的专有代码 ContractorB的专有代码 MyCompany的常用代码

有关如何处理此问题的任何想法?

由于MyCompany是ContractorA的克隆版,我不能只将访问ContractorB到MyCompany Repo,对吗?或者有没有办法限制每个用户的目录访问?

有没有办法将MyCompany分成新的存储库ContractorB并删除所有ContractorA专有代码,以便ContractorB永远不会看到任何ContractorA专有代码。如果是这种情况,我可以在本地机器上放置另一个别名,从ContractorA拉出,合并并推送到MyCompany,然后从ContractorB拉出,合并并推送到MyCompany?

这根本没有意义吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果您有Mercurial仓库,则需要完全和完全访问工作目录的整个历史记录。但是,您可以hg clone一个回购并且只包含克隆中的某些分支,只要您小心这些分支如何相互作用,您就可以实现目标。你确实有几个选项,我按照我的排名顺序列出了它们:

  1. 每个人都在不同的分支上工作您需要四个分支:corebranch-abranch-bcomposed-branch。分支之间的所有合并必须只有一种方式:core - > branch-a - > composed-branch

    • core:所有人共享的公共代码库。此代码的所有更新都需要在tip core完成,因为您永远不会将任何其他分支合并到其中。如果您对共享代码库进行更新,则将其合并到每个承包商分支中。如果承包商在他们自己的分支上做任何应该放入核心的东西,可以通过复制/粘贴或补丁手动对核心进行更新。
    • branch-abranch-b:这些由独立承包商完成独立工作。 ContractorA可以访问的公共仓库(用于推送和拉动)只会有更改corebranch-a,因为它们是其分支tip的唯一祖先。类似于ContractorB的回购。
    • composed-branch:这就是魔术发生的地方。当您从承包商处收到更新时,您从branch-abranch-b拉出并将它们合并到此分支中。您可以在此处理任何合并冲突,也可以进行任何其他更改以集成承包商完成的工作。这是构建系统提取的分支。
  2. 将您当前的回购分拆为几个较小的回购如果一个回购的错误推送风险太大,或者每个承包商的工作更像是dll或一个可以独立构建的库,将它们视为独立的回购可能更有意义。基本上是先前的建议,但独立的回购而不是独立的分支。您将再次将事物分为“全部使用”,“承包商创建”和“合计总数”。另请注意,您可能会发现hg的sub-repo很有用,但它被认为是“最后的特色”。

  3. 通过补丁完成所有工作承包商可以将更新作为导出的补丁发送给您,您可以申请并清理它们。这是一个坏主意,所以除非按下,否则我不会详细介绍,但这是可能的。

  4. 在所有情况下,您可能需要根据当前的代码库启动一个新的repo,以清除core内容的界限,并且可以被所有人看到。

    注意:即使您在回购邮件中有hg delete个文件,它们仍然可以在历史记录中完全访问!

答案 1 :(得分:0)

如果每个承包商必须让另一个承包商工作,除了“秘密部分”,你有

  • 在MyCompany repo上启用了MQ扩展
  • 将每个承包商的所有秘密部分移动到单独的MQ补丁(每个承包商一个补丁)
  • (克隆|推送到承包商的回购)只用他的补丁(挂钩可以帮助进行这样的状况检查)
  • 必须在将两个修补程序应用于MyCompany repo
  • 的情况下执行集成商的工作