git - 对目录的访问控制

时间:2014-07-15 09:07:33

标签: git

是否可以在git中控制不同的目录?

我有一个包含许多文件夹(实际上是包)的java项目,它为团队分工。 “Team Alpha”必须能够查看和更改包“alpha”和“Team Beta”必须能够查看和更改包“beta”。但是团队alpha 甚至无法看到包测试中的代码,而是改变了。

考虑到项目作为一个整体工作,并且为了编译和运行它,必须存在alpha和beta包,有没有办法控制它?

另一个问题:模块化设计是一种选择,对吗?整个项目可以使用alpha和beta软件包的编译版本,团队alpha有编译的beta包并反向...如果没有,为什么?

2 个答案:

答案 0 :(得分:1)

Git是一个分散版本控制系统。意味着每个人都可以访问所有内容并在本地拥有它的副本。因此,只允许开发人员访问某些目录,这违反了分散版本控制的原则......

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

以这种方式应该做的事情。

答案 1 :(得分:1)

一些背景

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

原因:

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

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

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

  • Git根本不跟踪目录。这是一个奇怪的事情,但它是真的。这就是为什么你不能向Git添加一个空目录。只有当跟踪文件时,才会跟踪目录(以所谓的“树对象”的形式),并在从版本控制中删除这些文件时跟踪目录。也就是说,跟踪目录只是因为当代流行的文件系统是分层的,Git必须处理这个问题。

    这不是一些设计疏忽,而是一种有意识的设计决策。你可以阅读Git创建者自己said on the "files vs content" debate

    因此,要知道的第二件事是将任何“管理”含义附加到目录明确地面对如何在Git中管理项目的想法。

你可以做些什么

使用submodules

比如说,如果您的团队α和β应该有单独的代码库,但是其他项目使用它们,请将α和β的代码库放入单独的存储库中,使用它们的项目也是一个单独的存储库,它使用子模块来引用它依赖的这两个项目。

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