例如:我有一个存储库 - repo1 具有这样的 fs 层次结构
repo1:
js
html
php/core
php/menu
我想授予repo1:php/menu
RW 权限 - 给一个自由职业者,但对于所有 repo1 - 这个自由职业者必须只有只读权限。
我可以用 gitolite 或 gitosis 做这个吗,或者可能是别的什么?
DVCS 上的 repo 访问权限始终链接到所有 repo,而不是 if 的一部分,主要是因为您克隆了所有 repo (浅克隆很难)。
这意味着gitolite(我什至不会提到已经过时的 gitosis )可以对以下内容建立限制:
但它不能阻止用户访问 repo 的一部分。
但是,从gitolite v3 或“g3”(2012 年 4 月 17 日)开始,您可以使用VREF 规则阻止写入(推送到)某些目录(除了某些分支)。
原始答案(gitolite V2 或 'g2',2011 年 11 月)
请参阅gitolite.conf
- 通过示例和旁注:refs 的“R”权限
repo gitolite-admin
RW+ = sitaram
# this is equivalent to:
RW+ refs/.* = sitaram
Sitaram 是唯一的管理员。他可以推送、创建、删除或倒带 gitolite-admin 存储库中的任何分支或标签。
R master = wally # MEANINGLESS! WILL NOT DO WHAT YOU THINK IT DOES!
这行不通。
您只能在 repo 级别限制“读取”访问,而不是在分支级别。
这是一个 git 问题,而不是 gitolite 问题。去打扰他们,或切换到gerrit。
gitolite 似乎可以实现您想要做的事情。看看这个:http ://sitaramc.github.com/gitolite/bac.html
读取访问权限将仅在 repo 级别,但是无论如何这就是您想要的..
第一个问题是 git 上下文中的“只读”和“读写”是什么意思。git 中的“写”由两个独立的操作组成。“提交”创建了一个跨越整个树的修订(git 根本没有任何每个文件的历史记录)和一个“推送”,将该修订复制到您的中央存储库中。
除了您自己,没有办法限制任何人的“提交”,因为用户必须手动将任何挂钩安装到他们的工作存储库中。因此,有问题的用户将能够创建一个提交来修改任何内容。他们还可以通过发送补丁、捆绑包或允许他们直接从工作存储库中提取来与您团队的其他成员共享该提交。
您可以限制的是“推送”到中央存储库。您可以创建一个update
或pre-receive
钩子(它们仅在调用约定上有所不同),它将检查修订内容并在它们触及您不想要的东西时拒绝它们。钩子接收 3 个参数,update
分支名称,旧提交和新提交,所以你只git diff --name-status
需要旧提交和新提交,如果给定用户(你必须查找如何从 gitolite 获取它)正在执行推送和更改影响您允许的子目录以外的其他影响,拒绝推送。
用户仍然可以编写影响树的其他部分的修订,并通过让其他人推动它来将其放入树干。这可能很有用,但您的同事需要注意,他们应该直接审查从顾问那里获得的更改。
请注意,检查提交作者或提交者是不安全的,因为作者可以自由设置。