精细访问 monorepo 中的目录

Granular access to directories within monorepo

我一直在阅读关于 monorepos 的优点,但还没有找到解决 sharing parts of a repo 问题的方法:

假设一个组织有一个 client/server Web 应用程序的单一存储库。他们雇用承包商来设计客户的某些部分。他们如何才能让承包商只能访问相关的客户端代码?即使 也不是微不足道的。

How can they give the contractor access to only the relevant client code?

他们没有。完整 monorepo 的机密性问题太重要了,无法缓解。
而 Git 本身有 no authorization (or authentication for that matter).
意思是:没有多少本机 Git 功能(子模块或子树)本身就足够了。

我通常看到一个中间门存储库,由承包商工作的相关部分组成,有一个同步过程到 import/export 工作。
如果该承包商远程工作,那么该提取物将托管在单独的服务器上,该服务器本身在 DMZ 中进行管理,并复制到互联网上的外部服务器,通过 VPN 访问?

考虑使用 git subtree

有了 git subtree,您将能够:

  • 创建一个由子树组成的单一存储库,每个子树都可以link编辑为单独的远程存储库。

    鉴于您的示例用例,承包商将只能访问绑定到 monorepo 的单个子树的远程 repo。

  • 有一个 aggregate/unified 历史(monorepo 的要点)

  • 将更改从远程子树拉入 monorepo

  • 将在 monorepo 的任何子树中所做的更改推送到其单独的远程

  • 保持您的 simple/easy 工作流。

    git subtree does not require users of your repository to learn anything new. They can ignore the fact that you are using git subtree to manage dependencies."

有关 pros/cons 的列表,请查看 Atlassian 的 Git subtree: the alternative to Git submodule。尽管我认为本文中的示例步骤即使没有过时也相当有限。

每一步都有 git log 详细信息的分步演示

  • Merging multiple repositories into a monorepo, while preserving history, using git subtree 中的示例和步骤比 Atlassian 文章更清晰、更合乎逻辑。
  • git subtrees: a tutorial 还包括在 monorepo 中进行更改并推送到子树 repo 的分步操作和结果,反之亦然,并提供了一些很好的提示。它确实提到了一个警告,那就是包含子树拉动的变基不起作用。另一个 post 解释,

    Do not be tempted to rebase this. Push it as is. If you rebase, git subtree won’t be able to reconcile the commits when you do your next subtree pull.

    如果您必须进行变基,下面的后续 Atlassian 文章 I link 提供了解决方法。

  • 我通常不喜欢看视频,但 Introduction to Git Subtrees 看起来很值得,而且有很多细节。它也比所有其他文章更新(2019 年)。提前了解您将要处理的内容令人欣慰。

如果你想深入了解

  • 解释了 git subtree 和 git 子树合并策略 (git merge -s subtree) 之间的区别。本质上,前者在幕后使用后者。换句话说,git 的 porcelainplumbing 的概念。
  • GitHub article about Git subtree merges 如果您喜欢这种方法,请使用合并策略。
  • A followup to the Atlassian article above 得到更多 "Under the hood of git subtree"。
  • Mastering Git subtrees 也很好,并提到了一些您可能会或可能不会接受的其他细节,并且具有所有 link 中最详细的逐步操作和结果我已经提供了。
  • 有关 git subtree 如何产生、它在内部如何工作以及子树如何优于子模块的一些历史,请参阅 Git: submodules vs. subtrees

monorepo-operator 是一个工具,可能 使管理基于子树的 monorepo 更容易。我没有使用过,也不能保证,但可能值得一试。

我不确定 monorepo,我知道这打破了 monorepo 问题,但我能想到的一种方法是构建您的项目(如果可能)以支持模块并使用 git 子模块 https://git-scm.com/book/en/v2/Git-Tools-Submodules

使用 git 提供商的访问控制,例如Gitlab、Bitbucket 等,您只能向承包商授予对特定 git 子模块的访问权限,无论是读/写还是管理员访问权限。

例如,在您的情况下,您可以只放置设计层(在另一个仓库中与客户端共享并将其作为主仓库的子模块),如果您想要更严格的安全性,如@VonC 提到的,您可以为您的子模块设置一个 VPN 访问的 repo。设置可能需要一些时间,但我认为考虑到风险,一旦正确实施,这可能是值得的。