GIT web Interface
=================

The one working on:
  http://www.kernel.org/git/

From the git version 1.4.0 gitweb is bundled with git.


How to configure gitweb for your local system
---------------------------------------------

You can specify the following configuration variables when building GIT:
 * GITWEB_SITENAME
   Shown in the title of all generated pages, defaults to the servers name.
 * GITWEB_PROJECTROOT
   The root directory for all projects shown by gitweb.
 * GITWEB_LIST
   points to a directory to scan for projects (defaults to project root)
   or to a file for explicit listing of projects.
 * GITWEB_HOMETEXT
   points to an .html file which is included on the gitweb project
   overview page.
 * GITWEB_CSS
   Points to the location where you put gitweb.css on your web server.
 * GITWEB_LOGO
   Points to the location where you put git-logo.png on your web server.
 * GITWEB_CONFIG
   This file will be loaded using 'require' and can be used to override any
   of the options above as well as some other options - see the top of
   'gitweb.cgi' for their full list and description.  If the environment
   $GITWEB_CONFIG is set when gitweb.cgi is executed the file in the
   environment variable will be loaded instead of the file
   specified when gitweb.cgi was created.


Runtime gitweb configuration
----------------------------

You can adjust gitweb behaviour using the file specified in `GITWEB_CONFIG`
(defaults to 'gitweb_config.perl' in the same directory as the CGI).
See the top of 'gitweb.cgi' for the list of variables and some description.
The most notable thing that is not configurable at compile time are the
optional features, stored in the '%features' variable. You can find further
description on how to reconfigure the default features setting in your
`GITWEB_CONFIG` or per-project in `project.git/config` inside 'gitweb.cgi'.


Webserver configuration
-----------------------

If you want to have one URL for both gitweb and your http://
repositories, you can configure apache like this:

<VirtualHost www:80>
    ServerName git.domain.org
    DocumentRoot /pub/git
    RewriteEngine on
    RewriteRule ^/(.*\.git/(?!/?(info|objects|refs)).*)?$ /cgi-bin/gitweb.cgi%{REQUEST_URI}  [L,PT]
    SetEnv	GITWEB_CONFIG	/etc/gitweb.conf
</VirtualHost>

The above configuration expects your public repositories to live under
/pub/git and will serve them as http://git.domain.org/dir-under-pub-git,
both as cloneable GIT URL and as browseable gitweb interface.
If you then start your git-daemon with --base-path=/pub/git --export-all
then you can even use the git:// URL with exactly the same path.

Setting the environment variable GITWEB_CONFIG will tell gitweb to use
the named file (i.e. in this example /etc/gitweb.conf) as a
configuration for gitweb.  Perl variables defined in here will
override the defaults given at the head of the gitweb.perl (or
gitweb.cgi).  Look at the comments in that file for information on
which variables and what they mean.


Originally written by:
  Kay Sievers <kay.sievers@vrfy.org>

Any comment/question/concern to:
  Git mailing list <git@vger.kernel.org>

