我已经在我自己的cgit config中做到了这一点。
# CGit on @PORT_HTTP_CGIT@
Listen @PORT_HTTP_CGIT@
<VirtualHost @FQN@:@PORT_HTTP_CGIT@>
ServerName @FQN@
ServerAlias @HOSTNAME@
SetEnv GIT_HTTP_BACKEND "@H@/usr/local/apps/git/libexec/git-core/git-http-backend"
DocumentRoot @H@/cgit
Alias /cgit @H@/cgit
<Directory @H@/cgit>
SetEnv GIT_PROJECT_ROOT=@H@/repositories
AddHandler cgi-script .cgi .pl
DirectoryIndex cgit.pl
(@xx@ 是值的模板占位符)
这个想法是用一个自定义脚本(这里是一个 perl 脚本,但你可以使用你想要的任何其他脚本语言)进行包装cgit.cgi
cgit.pl
,它将:
- 叫gitolite
- 只显示gitolite授权的内容
您可以在cgit.pl
此处查看完整的脚本。
这是您尝试访问特定存储库时:
if ($request_uri ne "/cgit/" && $request_uri ne "/cgit/cgit.pl/") {
(my $repo)=($path_info =~ /\/([^\/]+)/);
my $perm = "R";
if ($repo ne "") {
my $aperm = access( $repo, $user, 'R', 'any' );
# my ($aperm, $creator) = &repo_rights($repo);
$perm=$aperm;
}
if ($perm !~ /DENIED/) {
system("@H@/cgit/cgit.cgi");
}
}
这是当您在没有 repo 的情况下调用 cgit 时:它应该只列出您有权查看的 repos。
为此,调用 native cgit.cgi
,然后过滤输出,删除与“拒绝”存储库相对应的任何行:
my $fname="$user.".timestamp().".tpl";
system("@H@/cgit/cgit.cgi > $fname");
open(INFO, $fname); # Open the file
@lines = <INFO>; # Read it into an array
close(INFO);
unlink($fname);
pop(@lines);
foreach (@lines) {
my $line=$_;
(my $repo)=($line =~ /title='([^']+)'/); #'
my $perm = "R";
if ($repo ne "") {
my $aperm = access( $repo, $user, 'R', 'any' );
# my ($aperm, $creator) = &repo_rights($repo);
$perm=$aperm;
}
if ($perm !~ /DENIED/) {
print $line;
}
}