git - 目录访问控制

6

能否在git中控制不同的目录?

我有一个Java项目,里面有许多文件夹(实际上是包),它们分割了团队的工作。 "Alpha团队"必须能够查看和更改“alpha”包,而“Beta团队”必须能够查看和更改“beta”包。但是,Alpha团队甚至不能看到beta包中的代码,更别提更改了。

考虑到该项目作为整体运行,编译和运行需要同时存在alpha和beta包,是否有一种方法来控制这个问题呢?

另一个问题:模块化设计是一个选择吗?整个项目可以使用已编译的alpha和beta包,alpha团队有已编译的beta包以及反过来... 如果没有,为什么?


2
如果beta包可用(用于编译),开发人员将能够看到它... - Pinoniq
你的意思是“可用性”有多高?如果已编译,则不可用。 - Amir M
啊,你只想让编译好的软件包可用。 - Pinoniq
可能是重复的问题:git访问权限到存储库文件或路径 - kostix
2个回答

4

背景

虽然像gitolite这样的工具可以控制谁可以对存储库做什么(gitolite似乎是此类问题的事实标准低级解决方案),但它们只处理整个存储库。

原因如下:

  • 在分布式版本控制系统中:

    • 每个提交都代表整个存储库的状态。
    • 您无法克隆提交的一部分。即使您可以,也无法验证历史记录的完整性(由于缺少对象)。
    • 每个人都有完整的存储库克隆(好吧,在Git中,您可能只克隆足够的对象以获得单个提交或其中的一些,但这是一种“深度限制”操作而不是“宽度限制”)。

    因此,首先要知道的是,在DVCS中实现每个目录的访问控制在技术上是不可行的:拥有此选项将仅允许“全部或无”的访问权限:要么您对整个存储库具有读取(或写入)权限,要么没有此权限。 诸如gitolite之类的工具可以做到这一点。

  • Git根本不跟踪目录。 这是一个奇怪的事情,但它是真实的。 这就是为什么您无法将空目录添加到Git中的原因。 只有当其中的文件被跟踪并且从版本控制中删除这些文件时,目录才会以所谓的“树对象”的形式被跟踪,并在其内部进行跟踪。 也就是说,跟踪目录只是因为当代流行的文件系统是分层的,而Git必须处理此问题。

    这不是设计失误,而是有意的设计决策。 您可以阅读Git创建者本人在“文件与内容”辩论中的发言

    因此,第二件要知道的事情是,将任何“管理”含义附加到目录中明确地违反了Git中项目管理方式的基本思想。

你可以做什么

使用子模块

例如,如果您的团队α和β应具有单独的代码库,但某个其他项目同时使用它们,则将α和β的代码库分别放入单独的存储库中,并将使用它们的项目也放入单独的存储库中,该存储库使用子模块引用这两个依赖项项目。

子模块的一个属性是,子模块引用始终引用相应存储库中的确切提交,因此您第三个(依赖)存储库中的每个提交都将引用α和β的代码库的确切状态,在任何过去的时间点提供可重现的构建。


关于 gitolite 的更新。最近的版本能够基于用户将要获取或推送的“refs”(分支和标签)的名称来控制限制 - 请参阅文档。这不是关于目录,而是关于分支。尽管如此,在搜索过程中遇到这个问答的人可能会发现它很有用。 - kostix

1

Git是一种分布式版本控制系统,这意味着每个人都可以访问所有内容并在本地拥有副本。因此,仅为开发人员提供对特定目录的访问违反了分布式版本控制的原则...

针对您的问题,我建议: - 为每个软件包创建一个存储库 - 拥有一个包含所有已编译软件包的主存储库。 - 现在,软件包存储库具有对包含所有已编译软件包的主存储库的依赖关系。

采用这种方式应该就可以解决问题了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接