我必须部署一个Git存储库,其中几个开发团队将在独立的代码块中协同工作。我们有一个主要的内部集成团队,可以访问每个人的所有内容。但是,某些第三方开发人员无法访问我们公司的顶级数据和代码。
众所周知,这个工作流很难在纯git中实现,因为git假定项目中的每个人都可以使用克隆命令在任何环境下访问整个存储库。通过构造及其分布性,git的最低用户权限是只读访问权限。
建议通过Internet处理此问题的几种方法,特别是使用子模块,将每个团队分离到单个存储库中。但是,像子模块,子树和子项目这样的解决方案都会带来一些不可取的集成和管理复杂性。实际上,使用git这样的子模块作为访问控制系统似乎是一种误用。
经过研究,我得出结论,Gitolite可以成为实现我想要的可行工具。 Gitolite有一个名为部分拷贝的功能,它根据一组用户的规则集拒绝访问特定分支。如果您定义用户' bob'将只允许RW +访问分支“不稳定”。根据' partialCopy'一个主要项目' foo',而不是集成商开发商' john'可以将机密代码推送给主人,而不必担心“bob'阅读它。实际上,' bob'甚至不知道master branch下的文件存在。
但是,Gitolite是一种准系统方法,需要对存储库,用户密钥和权限文件进行低级管理。
考虑到这一切:在GitHub,GitLab,Bitbucket,CodeCommit等最好的git套件解决方案下是否有类似于部分复制功能的内容?
目标是为非技术经理部署一个具有更好的存储库管理,云支持,工具集成和GUI访问的git套件,并使用与Gitolite相同的细粒度访问控制。
答案 0 :(得分:2)
将它们分解为单独的存储库可能是您遇到的唯一可行选择。
部分副本似乎仅适用于分支机构。为了使其适用于您,您需要删除已隔离分支中已存在的受保护代码,这将导致更糟糕的集成问题。要在不访问原始文件的情况下执行此操作,您需要创建一个无基础分支,因为分支被定义为给定提交,并且所有提交都可以从该提交中获得。
创建无基础分支会引入额外的合并问题,无需共同的祖先,并且无法轻松地共享对不同分支中的公共文件的更改,而无需合并到要隔离的代码中。我在从其他系统迁移时只使用无基础分支的经验有限,所以我甚至不确定如何处理主线中的这么多文件从隔离线路中丢失。
逻辑上,这与在单独的存储库中实现子模块相同,只是使用第三方访问工具,因此它将具有相同的集成和管理开销(如果不是更多通过与git的本机设计运行相反)
解决你的一些问题,子模块并不像许多人那样糟糕,在你习惯它们之前它们只是有点尴尬。
如果不是这样的话。如果有很多共享组件,那么使用包和包管理器也是一个不错的选择。这使得人们可以访问该功能,如果您使用编译语言和以解释语言对代码进行只读访问,则无需授予他们访问代码的权限。 (我已经在几个非常大的项目中使用了它。)
使用多个存储库进行访问控制只是在许多非常大的项目(如内核)上使用的中尉/仁慈独裁者模型的稍微更正式的版本。这样可以使您的存储库轻松可管理。
答案 1 :(得分:1)
您的理解不太正确。 Gitolite的partial copy feature只是创建了另一个包含除禁用分支之外的所有存储库。推送到主存储库被自动推送到部分副本仓库并推送到部分副本仓库被推回到主仓库。
Gitolite实际上只是围绕git的一组非常好的perl包装器,以方便访问控制等。因此,那里没有魔法。 (例如,像gerrit那样重新实现自己的git服务器的一些工具可以用refs做聪明的事情.gitolite没有这样的东西,它使用股票git。)所以gitolite做的任何东西,你应该能够自己做,如果你真的很想。
您可以在下面的两个脚本中看到gitolite是如何做到的。根据我链接的文档,VREF作为部分副本仓库的“更新挂钩”执行。触发器代码作为主存储库的“post-receive hook”执行。
https://github.com/sitaramc/gitolite/blob/master/src/VREF/partial-copy https://github.com/sitaramc/gitolite/blob/master/src/triggers/partial-copy
我想你可以在任何允许你安装自己的钩子的git托管软件上自己实现。您需要进行的唯一更改是gitolite access
函数不存在,您需要自己编写一些内容来编码您想要的分支规则。