我一直在阅读monorepos的优点,但尚未发现以下问题的缓解方法:
比方说,一个组织有一个用于客户端/服务器Web应用程序的monorepo。他们雇用承包商来设计客户的某些部分。他们如何让承包商仅访问相关的客户代码?甚至sparse checkouts也不是小事。
答案 0 :(得分:3)
git subtree
。使用git subtree
,您将能够:
创建一个由子树组成的monorepo,每个子树都可以链接到单独的远程仓库。
在您的示例用例中,仅向承包商授予访问绑定到monorepo单个子树的远程repo的权限。
具有单一的汇总/统一历史记录(monorepo点)
从子树远程更改为monorepo
将在monorepo的任何子树中进行的更改推送到其单独的远程
保持简单/轻松的工作流。
git subtree
不需要您存储库的用户学习任何新知识。他们可以忽略您正在使用git subtree
来管理依赖项的事实。”
有关优点/缺点的列表,请查看Atlassian的Git subtree: the alternative to Git submodule。尽管我认为本文中的示例步骤相当局限,但即使不是过时的。
要逐步进行演示,并在每个步骤中提供git log
详细信息:
git subtree
中的示例和步骤比Atlassian文章更简洁,更合理。 git subtrees: a tutorial还包括逐步操作和结果,以在monorepo中进行更改并推送到子树repo,反之亦然,并提供了一些不错的技巧。它确实提到了一个警告,那就是包含子树拉取的重设基础不起作用。另一篇文章解释了
不要试图以此为基础。按原样推。如果您重新设置基础,则在执行下一个子树提取操作时,git子树将无法协调提交。
如果必须重新设置基准,我在下面链接的Atlassian后续文章提供了一种解决方法。
如果您想深入了解:
git subtree
和git 子树合并策略(git merge -s subtree
)之间的区别。本质上,前者在封面下使用后者。换句话说,git的瓷与水暖概念。 git subtree
的产生方式,内部运作方式以及子树比子模块更好的历史,请参见Git: submodules vs. subtrees。monorepo-operator是一个使 易于管理的工具。我没有使用过它,也无法担保它,但是可能值得一试。
答案 1 :(得分:1)
他们如何让承包商仅访问相关的客户代码?
他们没有。完整的monorepo的机密性问题太重要了,无法缓解。
而且Git本身有no authorization (or authentication for that matter)。
意思是:仅凭自身的本地Git功能(子模块或子树)数量就不够。
我通常会看到一个中间门仓库,该仓库由承包商工作的相关部分组成,并具有导入/导出工作的同步过程。
而且,如果该承包商正在远程工作,那么该摘录将托管在单独的服务器上,该服务器本身由DMZ管理,并复制到Internet上的外部服务器,可以通过VPN访问?
答案 2 :(得分:0)
我不确定monorepo,并且我知道这打破了monorepo问题,但是我能想到的一种方法是构建项目(如果可能)以支持模块并使用git子模块https://git-scm.com/book/en/v2/Git-Tools-Submodules
具有git提供程序的访问控制,例如Gitlab,Bitbucket等,您只能向承包商授予对特定git子模块的访问权限,无论其是读/写还是管理员访问权限。
例如,在您的情况下,您可以仅放置设计层(与客户端共享在另一个存储库中的设计层,并将其作为主存储库的子模块),如果您想要更严格的安全性(如@VonC所述),则可以为您的子模块设置VPN访问的存储库。设置可能会花费一些时间,但是我认为,一旦考虑到风险正确实施,这是值得的。