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"
我的服务器上有 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 thedev
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
正如 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"