git subtree
。使用git subtree
,您可以:
创建由子树组成的单体库,每个子树可以链接到单独的远程仓库。
在您的示例用例中,承包商只能访问与单体库的单个子树相关联的远程存储库。
具有单一聚合/统一历史记录(单体库的关键)
将来自子树远程的更改拉入单体库
将在单体库的任何子树中进行的更改推送到其单独的远程位置
保持简单易用的工作流。
git subtree
不需要您的版本库用户学习任何新知识。他们可以忽视您正在使用git subtree
管理依赖项的事实。
有关优点和缺点的列表,请参见Atlassian的Git subtree: the alternative to Git submodule。尽管我认为本文中的示例步骤相当有限,如果没有过时。
有关具有git log
每个步骤的详细演示的逐步说明:
在将多个存储库合并为单个管理库并保留历史记录,使用git subtree
的示例和步骤比Atlassian文章更清晰和更合乎逻辑。
Git subtrees: a tutorial还提供了逐步操作和结果,并对在管理库中进行更改并推送到子树存储库以及反之亦然的一些好建议。它确实提到了一个警告,即包含子树拉取的重新定义不起作用。另一篇文章解释说:
不要试图重新定义这个。按原样推送。如果您重新定义,当您进行下一个子树拉取时,git subtree将无法协调提交。
如果一定要重新定义,则我链接下面的Atlassian文章提供了解决方法。
我通常不喜欢观看视频,但介绍Git Subtrees 看起来值得一看,有很多细节。此外,它比所有其他文章都要新(2019年)。预先了解将要处理的内容是令人欣慰的。
如果您想深入了解::
git subtree
和git的subtree merge strategy(git merge -s subtree
)之间的区别。实质上,前者在幕后使用了后者。换句话说,这是git对于porcelain和plumbing的概念。git subtree
的历史以及它的内部工作方式,以及为什么子树比子模块更好,请参见Git: Submodules vs. Subtrees。Monorepo-operator是一种工具,可能会使得管理基于子树的单体库更加容易。我没有使用过它,也无法保证其质量,但也许值得了解一下。
我不确定关于单体仓库,我知道这违反了单体仓库的问题,但我想到的一种方法是:(如果可能的话)结构化项目以支持模块,并使用git子模块 https://git-scm.com/book/en/v2/Git-Tools-Submodules。
通过git提供商的访问控制(例如Gitlab、Bitbucket等),您只能将特定的git子模块访问权限赋予承包商,无论是读/写或管理员访问权限。
例如,在您的情况下,您可以将设计层(用于与客户共享的层)放在另一个仓库中,并将其作为主要仓库的子模块。如果您想要更严格的安全性,如@VonC所提到的,您可以为子模块设置VPN访问仓库。它可能需要一些时间来设置,但我认为一旦正确实施,考虑风险后它可能是值得的。