Gitolite限制访问分支

时间:2015-04-24 05:50:10

标签: branch gitolite policy restrict

我的服务器上有GITOLITE,我想配置对我的存储库的访问。我想限制某些用户访问某些分支。我尝试了很多变种如何配置gitolite.conf文件,我没有找到解决方案如何限制对某些分支的访问。

1)

@developers1 = user1
@developers2 = user2

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

当user2执行命令时:git push origin test:push success 在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

当user2执行命令时:git push origin test:push success 在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

当user2执行命令时: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 个答案:

答案 0 :(得分:3)

如果我查看official documentation

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
  

dilbertdev小组有这些限制

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有两个检查:

  • 当ref未知时(在这种情况下忽略- test),
  • 参考的一个已知。

在您的情况下,应该知道ref(test)并且适用deny规则。

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

gitolite access -s dbatest user2 W test

OP Sufelfay确认in the comments 适用于3.5.3,而非3.6.x

答案 1 :(得分:2)

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

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

@teamA = user1 user2
@teamB = user3 user4

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

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

答案 2 :(得分:1)

正如Sufelfay在对其他帖子的评论中所说,这是最近版本的Gitolite中的一个错误。

访问检查分为两个阶段。在初始阶段,参考文献是未知的,Gitolite应该跳过参考参考文献的所有规则。

但事实上,它适用所有规则但忽略了ref规范。因此...

- test = @developers2

...被评估为......

- = @developers2

......在第一阶段。更糟糕的是,错误表示最后处理的规则。这条规则可能不相关。

作为解决方法,您可以在拒绝规则之前为any添加访问规则:

RW  any   =  @developers2
-   test  =  @developers2
...