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

Project version control organization with multiple private entities contributing

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

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

更多详情:

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

MyCompany 现在包含对 ContractorA 的补充

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

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

所以 MyCompany 存储库包含来自 ContractorA 和 MyCompany 的所有更改

这非常适合我的需求,但是现在 ContractorB 将进入画面

承包商 A 拥有承包商 B 无法访问的专有内容,而承包商 B 拥有承包商 A 无法访问的专有内容。

ContractorA 将贡献一个公共部分,MyCompany 和 ContractorB 将使用该部分。

所有内容都需要在 MyCompany 中结束,因为我们将构建 1 个包含所有内容的构建 - ContractorA 修改的公共代码 来自 ContractorA 的专有代码 来自 ContractorB 的专有代码 来自 MyCompany 的通用代码

关于如何处理这个问题有什么想法吗?

由于 MyCompany 是 ContractorA 的克隆,我不能只将 ContractorB 的访问权限授予 MyCompany Repo,对吗?或者有没有办法限制每个用户在目录基础上的访问?

有没有办法将 MyCompany 分叉到新的存储库 ContractorB 中并删除所有 ContractorA 专有代码,这样 ContractorB 就永远看不到任何 ContractorA 专有代码。如果是这样的话,我可以在我的本地机器上放置另一个别名,从 ContractorA 中提取,合并并推送到 MyCompany,然后从 ContractorB 中提取,合并并推送到 MyCompany 吗?

这有什么意义吗?

谢谢!

如果您有 Mercurial 存储库,您将需要对工作目录的整个历史具有完全和完整的访问权限。但是,您可以 hg clone 一个 repo 并且只在克隆中包含某些分支,只要您注意这些分支的交互方式,就可以实现您的目标。您确实有几个选项,我已经按照我对它们的排名顺序列出了它们:

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

    • core:所有人共享的公共代码库。此代码的所有更新都需要在 coretip 完成,因为您 永远不会 将任何其他分支合并到其中。如果您对共享代码库进行更新,则将其合并到每个承包商分支中。如果承包商在他们自己的分支上做了任何应该放入核心的事情,请通过 copy/paste 或补丁手动更新核心。
    • branch-abranch-b:它们包含独立承包商完成的独立工作。 ContractorA 有权访问(用于推送和拉取)的 public 存储库将仅存在更改 corebranch-a,因为它们是其分支的 tip 的唯一祖先.对于 ContractorB 的存储库也是如此。
    • composed-branch:这就是魔法发生的地方。当您从承包商那里收到更新时,您从 branch-abranch-b 中提取并将它们合并到这个分支中。您可以在此处处理任何合并冲突,还可以进行任何其他更改以整合承包商所做的工作。这是您的构建系统拉取的分支。
  2. 将您当前的回购分成几个较小的回购如果一个回购不正确推送的风险太大,或者如果每个承包商的工作更像dll 或可以独立构建的库,将它们视为独立的 repos 可能更有意义。基本上是之前的建议,但独立的回购而不是独立的分支机构。您会再次将事物分为 "used by all"、"created by contractor" 和 "combined total"。另请注意,您可能会发现 hg 的 sub-repo 很有用,尽管它被认为是 "feature of last resort".

  3. 通过补丁完成这一切 承包商可以将更新作为导出的补丁发送给您,您可以应用和清理它们。这是个坏主意,所以除非迫不得已,否则我不会详细介绍,但这是可能的。

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

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

如果每个承包商必须找另一个承包商工作,除了"secret part",你有

  • 在 MyCompany 存储库上启用 MQ 扩展
  • 将每个承包商的所有秘密部分移动到单独的 MQ 补丁中(每个承包商一个补丁)
  • (克隆|推送到承包商的仓库)只应用了他的补丁(钩子可以帮助进行这种条件检查)
  • 您的集成商的工作必须在将两个补丁应用到 MyCompany 存储库的情况下执行