Gitolite限制分支访问

4
我有一个GITOLITE服务器,并希望配置对我的存储库的访问。我想要限制某些用户对某些分支的访问。我尝试了很多种方式来配置gitolite.conf文件,但是我没有找到如何限制对某些分支访问的解决方案。

1)

@developers1 = user1
@developers2 = user2

repo dbatest 
   RW+    = @developers1
   R test = @developers2
   - test = @developers2
   RW+    = @developers2

当用户2执行命令:git push origin test时,推送成功。在gitolite日志中我看到了这些行:

http    ARGV=user2  SOC=git-receive-pack 'dbatest'  FROM=10.65.184.239
6453    pre_git dbatest user2   W   any refs/.*
6453    system,git,http-backend
6453    END

2)

@developers1 = user1
@developers2 = user2

repo dbatest 
   RW+    = @developers1
   - test = @developers2
   RW+    = @developers2

当用户2执行命令:git push origin test时:推送成功。 在gitolite日志中,我看到了以下内容:

http    ARGV=user2  SOC=git-receive-pack 'dbatest'  FROM=10.65.184.239
6457    pre_git dbatest user2   W   any refs/.*
6457        system,git,http-backend
6457    END

3)

@developers1 = user1
@developers2 = user2

repo dbatest 
   RW+    = @developers1
   R test = @developers2
   - test = @developers2
   RW+    = @developers2
   option deny-rules = 1

当用户2执行命令:git push origin test 时,推送被拒绝并且他看到了以下信息:
fatal: remote error: FATAL: W any dbatest user2 DENIED by refs/heads/test
(or you mis-spelled the reponame)

在gitolite日志中,我看到了以下内容:
8161    http    ARGV=user2  SOC=git-receive-pack 'dbatest'  FROM=10.65.184.239
8161    die W any dbatest user2 DENIED by refs/heads/test<<newline>>(or you mis-spelled the reponame)

看起来不错,但当他试图将某些内容推送到主分支时,也遇到了这个消息。

我尝试在我的gitolite配置文件中混合这些行,但它们对我没有用。

如果有人能帮我解决这个问题,我会很高兴。我想限制某些开发人员对某些分支的写入访问权限。我不能创建额外的存储库,必须在一个主存储库上使用限制策略。

非常感谢!

3个回答

3

如果我查看官方文档

repo foo bar

    RW+                     =   alice @teamleads
    -   master              =   dilbert @devteam
    -   refs/tags/v[0-9]    =   dilbert @devteam
    RW+ dev/                =   dilbert @devteam
    RW                      =   dilbert @devteam
    R                       =   @managers

dilbert and the dev team has these restrictions

they can do anything to branches whose names start with "dev/"
**they can create or fast-forward push, but not rewind or delete, any branch except `master`**

所以这看起来是正确的:

- test  = @developers2
   RW+  = @developers2

然而,gitolite有两种检查方式:

  • 当引用未知时(此时- test被忽略),
  • 当引用已知时。

在您的情况下,引用(test)应该是已知的,并且拒绝规则应用。

您可以通过跟踪特定规则的逻辑来进行更多调试:

gitolite access -s dbatest user2 W test

Sufelfay用户评论中确认,此方法适用于3.5.3版本,不适用于3.6.x版本。


顺便问一下,@Sufelfay,你使用的是哪个版本的gitolite? - VonC
我的版本是 v 3.6.2。 - Sufelfay
在gitolite文件夹中没有,但在apache文件夹中有很多配置文件。为了连接我的用户,我使用HTTP而不是SSH,这可能是我的问题的原因吗? - Sufelfay
@Sufelfay 3.5.x。我可以从本地或远程(https或ssh)更新它。 - VonC
非常感谢!我在我的服务器上安装了Gitolite 3.5.3版本,现在它可以正常工作了。谢谢。 - Sufelfay
显示剩余5条评论

2

我知道这是一个老话题,但最近我做了一些研究并最终到达了这里。关于顶部答案的评论的快速更新。

我正在使用v3.6.4,以下解决方案有效:

@teamA = user1 user2
@teamB = user3 user4

repo foo
RW+ = @teamA
R = @teamB
RW+ ref/heads/banana = @teamB

在这种情况下,团队B被允许克隆存储库“foo”并仅推送到分支“banana”。

1
正如Sufelfay在其他帖子的评论中所说,这是Gitolite最近版本中的一个错误。
访问检查分为两个阶段。在初始阶段,引用未知,Gitolite应该跳过所有涉及引用的规则。
实际上,它应用了所有规则,但忽略了引用规范。因此...
- test = @developers2

... is evaluated as ...

- = @developers2

在第一阶段期间发生了错误。更糟糕的是,该错误指示处理的最后一条规则。这条规则可能与问题无关。
解决方法是在拒绝规则之前添加一个“任何人”的访问规则:
RW  any   =  @developers2
-   test  =  @developers2
...

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