Gitolite 限制对分支的访问

Gitolite restrict access to branch

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

1)

@developers1 = user1
@developers2 = user2

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

user2执行命令时: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

user2执行命令时: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

当 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)

看起来不错,但是当他尝试将某些内容推送到 master 分支时,他收到了这条消息。

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

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

非常感谢!

如果我看 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

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

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

在你的情况下,ref(测试)应该是已知的并且拒绝规则适用。

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

gitolite access -s dbatest user2 W test

OP Sufelfay confirms 它适用于 3.5.3,不适用于 3。6.x

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

访问检查分为两个阶段。在初始阶段,ref 是未知的,Gitolite 应该跳过所有引用 refs 的规则。

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

- test = @developers2

... 被评估为...

- = @developers2

...在第一阶段。更糟糕的是,错误指示最后处理的规则。此规则可能无关。

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

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

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

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

@teamA = user1 user2
@teamB = user3 user4

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

在这种情况下,允许 teamB 克隆 repo "foo" 并仅推送到分支 "banana"