Как заставить gitolite / gitweb работать вместе? - PullRequest
1 голос
/ 20 марта 2012

У меня установлены gitweb и gitolite.Я могу настроить репо для доступа к gitweb, и он появляется в файле "projects.list", но репозиторий не указан в браузере gitweb.

Я искал и искал, но не могу найти чтоМне не хватает этой работы.

Мой gitweb.conf содержит

$git_temp = "/tmp";

# The directories where your projects are. Must not end with a slash.
$projectroot = "/srv/git/repositories"; 
$projects_list = "/srv/git/projects.list";

Мой .gitolite.rc содержит

$PROJECTS_LIST = $ENV{HOME} . "/projects.list";

Я проверил и проекты.list файл получает обновления в соответствии с изменениями в конфигурации gitlite после того, как он будет возвращен в репозиторий.Поэтому я думаю, что это просто дурак, не видящий список и не действующий по нему, но я не могу понять, почему.

Я просто получаю страницу gitweb с надписью "404 - Проекты не найдены", где должен быть список проектов.

ОБНОВЛЕНИЕ:

Я обнаружил, что в моем случае проблема былавызвано неправильной конфигурацией Apache.Я следовал http://git@boron/testing.git. У меня в VirtualHost было следующее:

# Make sure we can execute gitweb okay
<Directory "/srv/http/gitweb">
        Options ExecCGI
        AllowOverride None
        AddHandler cgi-script .cgi
        DirectoryIndex gitweb.cgi
        Order allow,deny
        Allow from all
</Directory>

Это выполняло gitweb.cgi напрямую, как пользователь httpd и без каких-либо настроек среды.Я заменил этот блок явным вызовом моей оболочки suexec:

# Call GitoWeb cgi via suexec wrapper for relevant URLs
ScriptAliasMatch "^/$" /srv/http/git-suexec/gitweb.cgi.suexec-wrapper

И это решило мою проблему.

1 Ответ

0 голосов
/ 20 марта 2012

Как упоминает OP в комментарии, вам нужно убедиться, что ваш VirtulaHost в конфигурации Apache вызывает gitweb.cgi с правильными параметрами / переменными среды:

Вот мой httpd.conf для этой службы:
Обратите внимание, как он избежит ScriptAliasMatch и как он установит GIT_HTTP_BACKEND.

# GitWeb on 8443 # or any port you want
Listen 8443
<VirtualHost hostname>
    ServerName hostname
    ServerAlias short-hostname
    SSLCertificateFile "/path/to/apache/crt"
    SSLCertificateKeyFile "/path/to/apache/key"
    SSLEngine on
    SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    SetEnv GIT_HTTP_BACKEND /path/to/git/libexec/git-core/git-http-backend
    DocumentRoot /path/to/gitweb
    Alias /gitweb /path/to/gitweb
    <FilesMatch "\.(cgi|shtml|phtml|php)$">
      SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /path/to/gitweb>
        SSLOptions +StdEnvVars
        Options ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
        AllowOverride All
        order allow,deny
        Allow from all

        AuthName "LDAP authentication for GitWeb repositories"
        AuthType Basic
        AuthBasicProvider myldap companyldap
        AuthzLDAPAuthoritative On
        Require valid-user

        AddHandler cgi-script cgi
        DirectoryIndex gitweb.cgi

        RewriteEngine Off
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^[a-zA-Z0-9_\-]+\.git/?(\?.*)?$ /gitweb.cgi%{REQUEST_URI} [L,PT]
    </Directory>
</VirtualHost>

Оригинальный ответ:

Вот мой gitweb.conf.pl:

my $gl_home = $ENV{HOME} = "@H@";

# the following variables are needed by gitolite; please edit before using

# this should normally not be anything else
$ENV{GL_RC} = "$gl_home/.gitolite.rc";
# this can have different values depending on how you installed.

# if you used RPM/DEB or "root" methods it **might** be this:
$ENV{GL_BINDIR} = "/usr/local/bin";
# if you used the "non-root" method it **might** be this:
$ENV{GL_BINDIR} = "$gl_home/gitolite/bin";
# If in doubt take a look at ~/.ssh/authorized_keys; at least one of the lines
# might contain something like:
#       command="/home/git/.gitolite/src/gl-auth-command
# and you should use whatever directory the gl-auth-command is in (in this
# example /home/git/.gitolite.src)

# finally the user name
$ENV{GL_USER} = $cgi->remote_user || "gitweb";

# now get gitolite stuff in...
unshift @INC, $ENV{GL_BINDIR};
require gitolite_rc;    gitolite_rc -> import;
require gitolite;       gitolite    -> import;

# set project root etc. absolute paths
$ENV{GL_REPO_BASE_ABS} = ( $REPO_BASE =~ m(^/) ? $REPO_BASE : "$gl_home/$REPO_BASE" );
$projects_list = $projectroot = $ENV{GL_REPO_BASE_ABS};

$export_auth_hook = sub {
    my $repo = shift;
    # gitweb passes us the full repo path; so we strip the beginning
    # and the end, to get the repo name as it is specified in gitolite conf
    return unless $repo =~ s/^\Q$projectroot\E\/?(.+)\.git$/$1/;

    # check for (at least) "R" permission
    my ($perm, $creator) = &repo_rights($repo);
    return ($perm =~ /R/);
};

Замените @ H @ вашим путем, где ваши файлы .gitolite, .gitoliterc, repositories, project.list.

Обратите внимание, как я определил $ENV{GL_BINDIR}: Iне комментировал второе определение, потому что в моем случае я выполнял установку без полномочий root, поэтому:

$ENV{GL_BINDIR} = "$gl_home/gitolite/bin";

Убедитесь, что у вас есть gitweb_config.perl с:

our $home_link_str = "ITSVC projects";
our $site_name = "ITSVC Gitweb";

use lib (".");
require "gitweb.conf.pl";

Это то, что сделает связь между gitweb и дополнительным gitweb.conf.pl, который будет называть gitolite.

...