Git 的逐目录权限管理

20
我们正在考虑将版本控制系统切换到git或subversion。我更喜欢切换到git,但是svn有一个很好的功能在git中找不到:每个目录的访问控制权限。
我们目前在cvs中拥有project1、project2存储库,并具有不同的权限。我们想要一个单一的存储库,其中包含两个目录project1和project2,具有不同的权限。使用git是否可行,就像在svn中一样?
我知道子模块可能可以实现这一点,但对我们来说,目标是能够用更改项目1和项目2的一个单一提交。
我们主要涉及知识产权问题,并希望确保某些人无法阅读(而不仅仅是推送)某些目录。因此,git是否能够应对挑战,还是我必须使用git-svn?
谢谢
3个回答

5

你可以使用一个中央仓库,并由gitolite管理访问权限(推送/拉取)。
请查看其功能

如果你将其与子模块结合使用(你已经了解),则只需管理每个仓库或每个分支的访问权限,仍然可以提交project1和project2(如果是子仓库,则有两个提交:请参见this question)。

如果你坚持使用一个仓库(即使你有两组数据,它们可能会随着自己的生命周期发展,这应该使它们成为模块的好选择),那么 gitolite 的功能包括:

基于文件/目录名称的限制

除了基于分支名称的限制之外,gitolite 还允许你限制哪些文件或目录可以参与被推送的更改

dpk在评论中提到,这个最后的功能(文件/目录名称限制)在 Gitolite 的 conf/example.conf 文件中有详细说明。


是的,我看到了,但在我看来,这里的权限似乎只涉及阻止推送操作,而不是克隆操作时的读取权限。我几乎无法理解克隆操作如何与拒绝读取权限相关联。 - Wam
@Wam:如果要进行读取操作,你必须使用子模块方法:gitolite将防止任何具有正确ACL的存储库进行克隆和拉取(子模块是其自己的Git存储库)。换句话说,它将在存储库或分支级别上阻止拉取。 - VonC
很难找到这个功能的文档,所以我会在这里提供链接给其他人搜索并进入此SO页面的人:https://github.com/sitaramc/gitolite/blob/pu/conf/example.conf - user153275
1
@dpk:非常好。我已经将该链接添加到答案中以增加可见性。 - VonC
1
@ihebiheb 谢谢。我已经恢复了这个链接以及上一个 (conf/example.conf)。 - VonC
显示剩余4条评论

3

尝试使用 nigit https://github.com/kingsimba/nigit。我的团队(30人以上)已经使用它多年。

它可以作为一个整体来管理相关项目,将它们汇集在一起,同时切换分支等。每个项目都有自己的合作者和权限。

如果某人没有权限访问某些源代码(子项目),他们可以使用编译后的二进制文件。

$ nigit status
=== nigit ===
+ some_new_file
- some_deleted_file
M some_modified_file
? some_untracked_file
=== ncgeo ===
- other_deleted_file
? other_untracked_file

正是我所需要的!这是解决git在每个目录权限上不足的优雅解决方案。 - Wang Yudong
我们有一个类似的用例,但需要下载Conan包作为替代方案,如果用户无法访问相应的子模块。请参见此处的问题:https://github.com/kingsimba/nigit/issues/9 我很乐意听取任何建议。 - Stefan Profanter

0
我尝试了一些Git钩子+部分克隆+HTTP反向代理的方法,以实现Github对每个文件夹的读取权限。虽然还远非完美,但这是一个可行的方向,可以在这里找到相关信息。

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