是否可以在git中控制不同的目录?
我有一个包含许多文件夹(实际上是包)的java项目,它为团队分工。 “Team Alpha”必须能够查看和更改包“alpha”和“Team Beta”必须能够查看和更改包“beta”。但是团队alpha 甚至无法看到包测试中的代码,而是改变了。
考虑到项目作为一个整体工作,并且为了编译和运行它,必须存在alpha和beta包,有没有办法控制它?
另一个问题:模块化设计是一种选择,对吗?整个项目可以使用alpha和beta软件包的编译版本,团队alpha有编译的beta包并反向...如果没有,为什么?
答案 0 :(得分:1)
Git是一个分散版本控制系统。意味着每个人都可以访问所有内容并在本地拥有它的副本。因此,只允许开发人员访问某些目录,这违反了分散版本控制的原则......
对于你的问题,我会: - 为每个包创建一个存储库 - 拥有包含所有已编译软件包的主存储库。 - 包存储库现在具有与主存储库的依赖关系,包含所有已编译的包。
以这种方式应该做的事情。答案 1 :(得分:1)
虽然像gitolite
这样的工具可能会控制谁可以对存储库做什么(gitolite
似乎是事实上的标准低级解决方案),但它们只能处理整个存储库。
原因:
在分布式版本控制系统中:
因此,首先要知道的是,在DVCS中实现每个目录访问控制在技术上是不可行的:拥有此选项只允许“全部或全部”访问:要么您已经读取(或写入)整体权限存储库或没有此权限。像gitolite
这样的工具可以做到这一点。
Git根本不跟踪目录。这是一个奇怪的事情,但它是真的。这就是为什么你不能向Git添加一个空目录。只有当跟踪文件时,才会跟踪目录(以所谓的“树对象”的形式),并在从版本控制中删除这些文件时跟踪目录。也就是说,跟踪目录只是因为当代流行的文件系统是分层的,Git必须处理这个问题。
这不是一些设计疏忽,而是一种有意识的设计决策。你可以阅读Git创建者自己said on the "files vs content" debate。
因此,要知道的第二件事是将任何“管理”含义附加到目录明确地面对如何在Git中管理项目的想法。
使用submodules。
比如说,如果您的团队α和β应该有单独的代码库,但是其他项目使用它们,请将α和β的代码库放入单独的存储库中,使用它们的项目也是一个单独的存储库,它使用子模块来引用它依赖的这两个项目。
子模块的一个属性是子模块引用始终引用相应存储库中的精确提交,因此第三个(从属)存储库中的每个提交都将引用α和β代码库的精确状态,从而在任何过去提供可重现的构建点。