Zack
Zack

Reputation: 55

gitweb 404 - No projects found

I installed git + gitolite + git-daemon + gitweb setup on Ubuntu 12.04 server. The problem is I getting always 404 - No projects found. I added a user called git and configured gitolite. After installing git-web added user www-data to gitolite and set chmod of project.list to g+r and repositories directory to g+rx.

git@aranox~$ ls -al
total 44
drwxr-xr-x  6 git  git  4096 Aug 20 16:47 .
drwxr-xr-x 18 root root 4096 Aug 13 19:44 ..
-rw-------  1 git  git  1348 Aug 20 16:48 .bash_history
drwx------  2 git  git  4096 Aug 19 16:38 .cache
drwx------  8 git  git  4096 Aug 19 16:30 .gitolite
-rw-r--r--  1 git  git  4217 Aug 20 16:03 .gitolite.rc
-rw-r-----  1 git  git     0 Aug 20 16:05 projects.list
drwxr-x---  5 git  git  4096 Aug 19 16:49 repositories
drwx------  2 git  git  4096 Aug 20 16:05 .ssh
-rw-------  1 git  git   887 Aug 20 16:03 .viminfo

Now I changed $REPO_UMASK in my .gitolite.rc to 0077 Here my .gitolite.rc

# configuration variables for gitolite

# PLEASE READ THE DOCUMENTATION BEFORE EDITING OR ASKING QUESTIONS
# ( http://github.com/sitaramc/gitolite/blob/pu/doc/gitolite.rc.mkd )
#   ( or http://sitaramc.github.com/gitolite/doc/gitolite.rc.html )

# this file is in perl syntax.  However, you do NOT need to know perl to edit
# it; it should be fairly self-explanatory and easy to maintain

# ------------------------------------------------------------------------------
# DO NOT TOUCH THIS SECTION!
# ------------------------------------------------------------------------------

$GL_ADMINDIR=$ENV{HOME} . "/.gitolite";
$GL_CONF="$GL_ADMINDIR/conf/gitolite.conf";
$GL_KEYDIR="$GL_ADMINDIR/keydir";
$GL_CONF_COMPILED="$GL_ADMINDIR/conf/gitolite.conf-compiled.pm";

# DO NOT CHANGE THE NEXT FOUR LINES UNLESS YOU REALLY KNOW WHAT YOU'RE DOING.
# These variables are set automatically by the install method you choose.
#            (PACKAGE MAINTAINERS: PLEASE READ doc/packaging.mkd)
$GL_PACKAGE_CONF = "/usr/share/gitolite/conf";
$GL_PACKAGE_HOOKS = "/usr/share/gitolite/hooks";

# ------------------------------------------------------------------------------
# most often used/changed variables
# ------------------------------------------------------------------------------
$GL_WILDREPOS = 0;
$PROJECTS_LIST = $ENV{HOME} . "/projects.list";
# $WEB_INTERFACE = "gitweb";
# $GITWEB_URI_ESCAPE = 0;
$REPO_UMASK = 0027;

# ------------------------------------------------------------------------------
# variables with an efficiency/performance impact
# ------------------------------------------------------------------------------
$GL_BIG_CONFIG = 0;
$GL_NO_DAEMON_NO_GITWEB = 0;
# $GL_NICE_VALUE = 0;
# $BIG_INFO_CAP = 20;

# ------------------------------------------------------------------------------
# VARIABLES WITH A SECURITY IMPACT.  READ DOCS BEFORE CHANGING THESE!
# http://github.com/sitaramc/gitolite/blob/pu/doc/gitolite.rc.mkd#_variables_with_a_security_impact
# (or http://sitaramc.github.com/gitolite/doc/gitolite.rc.html#_variables_with_a_security_impact)
# ------------------------------------------------------------------------------
# $GL_ALL_READ_ALL = 0;
$GIT_PATH="";
$GL_GITCONFIG_KEYS = "";
$GL_NO_CREATE_REPOS = 0;
$GL_NO_SETUP_AUTHKEYS = 0;
# $GL_WILDREPOS_DEFPERMS = 'R @all';
$HTPASSWD_FILE = "";
$RSYNC_BASE = "";
$SVNSERVE = "";

# $UPDATE_CHAINS_TO = "hooks/update.secondary";
# $ADMIN_POST_UPDATE_CHAINS_TO = "hooks/post-update.secondary";
# $GL_ADC_PATH = "";
# $GL_GET_MEMBERSHIPS_PGM = "/usr/local/bin/expand-ldap-user-to-groups"
# $GL_HTTP_ANON_USER = "mob";
# $GL_REF_OR_FILENAME_PATT=qr(^[0-9a-zA-Z][0-9a-zA-Z._\@/+ :,-]*$);

# ------------------------------------------------------------------------------
# less used/changed variables
# ------------------------------------------------------------------------------
# $GL_ALL_INCLUDES_SPECIAL = 0;
# $GL_SLAVE_MODE = 0;
# $ENV{GL_SLAVES} = 'gitolite@server2 gitolite@server3';
# PLEASE USE SINGLE QUOTES ABOVE, NOT DOUBLE QUOTES
$GL_WILDREPOS_PERM_CATS = "READERS WRITERS";
# $GL_SITE_INFO = "XYZ.COM DEVELOPERS: PLEASE SEE http://xyz.com/gitolite/help first";
# $GL_HOSTNAME = "frodo";       # read doc/mirroring.mkd COMPLETELY before setting this

# ------------------------------------------------------------------------------
# rarely changed variables
# ------------------------------------------------------------------------------
$GL_LOGT="$GL_ADMINDIR/logs/gitolite-%y-%m.log";
# $GL_PERFLOGT="$GL_ADMINDIR/logs/perf-gitolite-%y-%m.log";

# ------------------------------------------------------------------------------
# variables that should NOT be changed after the install step completes
# ------------------------------------------------------------------------------
$REPO_BASE="repositories";

# ------------------------------------------------------------------------------
# DO NOT TOUCH ANY THING AFTER THIS LINE
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
# per perl rules, this should be the last line in such a file:
1;

# Local variables:
# mode: perl
# End:
# vim: set syn=perl:

Next changed the $projectroot and $projects_list of my /etc/gitweb.conf and added some configurations. Here my gitweb.conf

# path to git projects (<project>.git)
$projectroot = "/home/git/repositories";

# directory to use for temp files
$git_temp = "/tmp";

# target of the home link on top of all pages
#$home_link = $my_uri || "/";

# html text to include at home page
#$home_text = "indextext.html";

# file with project list; by default, simply scan the projectroot dir.
$projects_list = "/home/git/projects.list";

# stylesheet to use
#@stylesheets = ("static/gitweb.css");

# javascript code for gitweb
#$javascript = "static/gitweb.js";

# logo to use
#$logo = "static/git-logo.png";

# the 'favicon'
#$favicon = "static/git-favicon.png";

# git-diff-tree(1) options to use for generated patches
#@diff_opts = ("-M");
@diff_opts = ();


# Enable PATH_INFO so the server can produce URLs of the
# form: http://git.cdwilson.us/project.git/xxx/xxx
# This allows for pretty URLs *within* the Git repository, where
# my Apache rewrite rules are not active.
$feature{'pathinfo'}{'default'} = [1];

$projects_list_description_width = 100;

# Enable blame, pickaxe search, snapshop, search, and grep
# support, but still allow individual projects to turn them off.
# These are features that users can use to interact with your Git trees. They
# consume some CPU whenever a user uses them, so you can turn them off if you
# need to. Note that the 'override' option means that you can override the
# setting on a per-repository basis.
$feature{'blame'}{'default'} = [1];
$feature{'blame'}{'override'} = 1;

$feature{'pickaxe'}{'default'} = [1];
$feature{'pickaxe'}{'override'} = 1;

$feature{'snapshot'}{'default'} = [1];
$feature{'snapshot'}{'override'} = 1;

$feature{'search'}{'default'} = [1];

$feature{'grep'}{'default'} = [1];
$feature{'grep'}{'override'} = 1;

$feature{'show-sizes'}{'default'} = [1];
$feature{'show-sizes'}{'override'} = 1;

$feature{'avatar'}{'default'} = ['gravatar'];
$feature{'avatar'}{'override'} = 1;

$feature{'highlight'}{'default'} = [1];
$feature{'highlight'}{'override'} = 1;

Finally created a new vhost entry at my apache

<VirtualHost 88.198.64.228:80>
        ServerName git.aranox.de
        ServerAlias www.git.aranox.de
        DocumentRoot /usr/share/gitweb
        ErrorLog /var/log/vhosts/git.aranox.de_error_log
        CustomLog /var/log/vhosts/git.aranox.de_access_log combined
        <Directory /usr/share/gitweb>
                Options +Indexes +ExecCGI +FollowSymLinks
                AllowOverride All
                Order allow,deny
                Allow from all
                AddHandler cgi-script .cgi
                DirectoryIndex gitweb.cgi
                RewriteEngine On
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteRule ^.* /index.cgi/$0 [L,PT]
        </Directory>
</VirtualHost>

I restarted apache2 and a looks fine, but still getting "No Projects found" error. I used google and search at stackoverflow, but still not found a solution. Alltime I found that the permission is wrong, but I might it ok like it is.

Thanks for any solution.

Upvotes: 1

Views: 6024

Answers (1)

VonC
VonC

Reputation: 1328722

As the OP Zack mentions, gitolite will use the project.list file (also used by gitweb) in order to know the list of projects to parse.

My projects.list was empty. Do not know why.
I added the repositories manually and all fine.

This is similar to this question "Gitweb document root with gitolite", where adding the project.list was also enough.


Original answer:

Nothing in here calls directly gitolite, and the gitolite.rc file is a g2 (gitolite V2) file, not a g3 one.

So first, make sure to install the latest gitolite V3 (see this installation script for instance).

Second, git-daemon isn't needed for this setup: only an Apache server which will call the gitweb.cgi script: see this httpd.conf config file, extract below:

# GitWeb on @PORT_HTTP_GITWEB@
Listen @PORT_HTTP_GITWEB@
<VirtualHost @FQN@:@PORT_HTTP_GITWEB@>
ServerName @FQN@
ServerAlias @HOSTNAME@
SetEnv GIT_HTTP_BACKEND "@H@/usr/local/apps/git/libexec/git-core/git-http-backend"
DocumentRoot @H@/gitweb
Alias /git @H@/gitweb

<Directory @H@/gitweb>
  AddHandler cgi-script cgi
  DirectoryIndex gitweb.cgi

The link between gitweb and gitolite is made through a gitweb hook: if gitweb detects the presence of a gitweb_config.perl (like this one), right along the other gitweb files, it will call it. I, in turn, make it call a gitweb.conf.pl file with a function named export_auth_hook in it, which is a hook called by gitweb (again, if it exists).

$export_auth_hook = sub {
  my $repo = shift;
  my $user = $ENV{GL_USER};
  # 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 $ret = &access( $repo, $user, 'R', 'any' );
  my $res = $ret !~ /DENIED/;
  return ($ret !~ /DENIED/);
};

And that is it: it is enough for your gitweb to display the projects you have access to, according to the gitolite config.
This is not, however, a way to clone/push or pull git repo, as I explain in "Missing repos in gitweb".

Upvotes: 1

Related Questions