GIT web Interface (gitweb) Installation
=======================================

First you have to generate gitweb.cgi from gitweb.perl using
"make gitweb", then "make install-gitweb" appropriate files
(gitweb.cgi, gitweb.js, gitweb.css, git-logo.png and git-favicon.png)
to their destination. For example if git was (or is) installed with
/usr prefix and gitwebdir is /var/www/cgi-bin, you can do

	$ make prefix=/usr gitweb                            ;# as yourself
	# make gitwebdir=/var/www/cgi-bin install-gitweb     ;# as root

Alternatively you can use autoconf generated ./configure script to
set up path to git binaries (via config.mak.autogen), so you can write
instead

	$ make configure                     ;# as yourself
	$ ./configure --prefix=/usr          ;# as yourself
	$ make gitweb                        ;# as yourself
	# make gitwebdir=/var/www/cgi-bin \
	       install-gitweb                ;# as root

The above example assumes that your web server is configured to run
[executable] files in /var/www/cgi-bin/ as server scripts (as CGI
scripts).


Requirements
------------

 - Core git tools
 - Perl
 - Perl modules: CGI, Encode, Fcntl, File::Find, File::Basename.
 - web server

The following optional Perl modules are required for extra features
 - Digest::MD5 - for gravatar support
 - CGI::Fast and FCGI - for running gitweb as FastCGI script
 - HTML::TagCloud - for fancy tag cloud in project list view
 - HTTP::Date or Time::ParseDate - to support If-Modified-Since for feeds


Build time configuration
------------------------

See also "How to configure gitweb for your local system" section below.

- There are many configuration variables which affect building of
  gitweb.cgi; see "default configuration for gitweb" section in main
  (top dir) Makefile, and instructions for building gitweb target.

  One of the most important is where to find the git wrapper binary. Gitweb
  tries to find the git wrapper at $(bindir)/git, so you have to set $bindir
  when building gitweb.cgi, or $prefix from which $bindir is derived. If
  you build and install gitweb together with the rest of the git suite,
  there should be no problems. Otherwise, if git was for example
  installed from a binary package, you have to set $prefix (or $bindir)
  accordingly.

- Another important issue is where are git repositories you want to make
  available to gitweb. By default gitweb searches for repositories under
  /pub/git; if you want to have projects somewhere else, like /home/git,
  use GITWEB_PROJECTROOT build configuration variable.

  By default all git repositories under projectroot are visible and
  available to gitweb. The list of projects is generated by default by
  scanning the projectroot directory for git repositories. This can be
  changed (configured) as described in "Gitweb repositories" section
  below.

  Note that gitweb deals directly with the object database, and does not
  need a working directory; the name of the project is the name of its
  repository object database, usually projectname.git for bare
  repositories. If you want to provide gitweb access to non-bare (live)
  repositories, you can make projectname.git a symbolic link under
  projectroot linking to projectname/.git (but it is just
  a suggestion).

- You can control where gitweb tries to find its main CSS style file,
  its JavaScript file, its favicon and logo with the GITWEB_CSS, GITWEB_JS
  GITWEB_FAVICON and GITWEB_LOGO build configuration variables. By default
  gitweb tries to find them in the same directory as gitweb.cgi script.

- You can optionally generate minified versions of gitweb.js and gitweb.css
  by defining the JSMIN and CSSMIN build configuration variables. By default
  the non-minified versions will be used. NOTE: if you enable this option,
  substitute gitweb.min.js and gitweb.min.css for all uses of gitweb.js and
  gitweb.css in the help files.


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

You can specify the following configuration variables when building GIT:

 * GIT_BINDIR
   Points where to find the git executable.  You should set it up to
   the place where the git binary was installed (usually /usr/bin) if you
   don't install git from sources together with gitweb.  [Default: $(bindir)]
 * GITWEB_SITENAME
   Shown in the title of all generated pages, defaults to the server name
   (SERVER_NAME CGI environment variable) if not set. [No default]
 * GITWEB_PROJECTROOT
   The root directory for all projects shown by gitweb. Must be set
   correctly for gitweb to find repositories to display.  See also
   "Gitweb repositories" in the INSTALL file for gitweb.  [Default: /pub/git]
 * GITWEB_PROJECT_MAXDEPTH
   The filesystem traversing limit for getting the project list; the number
   is taken as depth relative to the projectroot.  It is used when
   GITWEB_LIST is a directory (or is not set; then project root is used).
   This is meant to speed up project listing on large work trees by limiting
   search depth.  [Default: 2007]
 * GITWEB_LIST
   Points to a directory to scan for projects (defaults to project root
   if not set / if empty) or to a file with explicit listing of projects
   (together with projects' ownership). See "Generating projects list
   using gitweb" in INSTALL file for gitweb to find out how to generate
   such file from scan of a directory. [No default, which means use root
   directory for projects]
 * GITWEB_EXPORT_OK
   Show repository only if this file exists (in repository).  Only
   effective if this variable evaluates to true.  [No default / Not set]
 * GITWEB_STRICT_EXPORT
   Only allow viewing of repositories also shown on the overview page.
   This for example makes GITWEB_EXPORT_OK to decide if repository is
   available and not only if it is shown.  If GITWEB_LIST points to
   file with list of project, only those repositories listed would be
   available for gitweb.  [No default]
 * GITWEB_HOMETEXT
   Points to an .html file which is included on the gitweb project
   overview page ('projects_list' view), if it exists.  Relative to
   gitweb.cgi script.  [Default: indextext.html]
 * GITWEB_SITE_HTML_HEAD_STRING
   html snippet to include in the <head> section of each page. [No default]
 * GITWEB_SITE_HEADER
   Filename of html text to include at top of each page.  Relative to
   gitweb.cgi script.  [No default]
 * GITWEB_SITE_FOOTER
   Filename of html text to include at bottom of each page.  Relative to
   gitweb.cgi script.  [No default]
 * GITWEB_HOME_LINK_STR
   String of the home link on top of all pages, leading to $home_link
   (usually main gitweb page, which means projects list).  Used as first
   part of gitweb view "breadcrumb trail": <home> / <project> / <view>.
   [Default: projects]
 * GITWEB_SITENAME
   Name of your site or organization to appear in page titles.  Set it
   to something descriptive for clearer bookmarks etc.  If not set
   (if empty) gitweb uses "$SERVER_NAME Git", or "Untitled Git" if
   SERVER_NAME CGI environment variable is not set (e.g. if running
   gitweb as standalone script).  [No default]
 * GITWEB_BASE_URL
   Git base URLs used for URL to where fetch project from, i.e. full
   URL is "$git_base_url/$project".  Shown on projects summary page.
   Repository URL for project can be also configured per repository; this
   takes precedence over URLs composed from base URL and a project name.
   Note that you can setup multiple base URLs (for example one for
   git:// protocol access, another for http:// access) from the gitweb
   config file.  [No default]
 * GITWEB_CSS
   Points to the location where you put gitweb.css on your web server
   (or to be more generic, the URI of gitweb stylesheet).  Relative to the
   base URI of gitweb.  Note that you can setup multiple stylesheets from
   the gitweb config file.  [Default: static/gitweb.css (or
   static/gitweb.min.css if the CSSMIN variable is defined / CSS minifier
   is used)]
 * GITWEB_JS
   Points to the location where you put gitweb.js on your web server
   (or to be more generic URI of JavaScript code used by gitweb).
   Relative to base URI of gitweb.  [Default: static/gitweb.js (or
   static/gitweb.min.js if JSMIN build variable is defined / JavaScript
   minifier is used)]
 * CSSMIN, JSMIN
   Invocation of a CSS minifier or a JavaScript minifier, respectively,
   working as a filter (source on standard input, minified result on
   standard output).  If set, it is used to generate a minified version of
   'static/gitweb.css' or 'static/gitweb.js', respectively.  *Note* that
   minified files would have *.min.css and *.min.js extension, which is
   important if you also set GITWEB_CSS and/or GITWEB_JS.  [No default]
 * GITWEB_LOGO
   Points to the location where you put git-logo.png on your web server
   (or to be more generic URI of logo, 72x27 size, displayed in top right
   corner of each gitweb page, and used as logo for Atom feed).  Relative
   to base URI of gitweb.  [Default: static/git-logo.png]
 * GITWEB_FAVICON
   Points to the location where you put git-favicon.png on your web server
   (or to be more generic URI of favicon, assumed to be image/png type;
   web browsers that support favicons (website icons) may display them
   in the browser's URL bar and next to site name in bookmarks).  Relative
   to base URI of gitweb.  [Default: static/git-favicon.png]
 * GITWEB_CONFIG
   This Perl file will be loaded using 'do' and can be used to override any
   of the options above as well as some other options -- see the "Runtime
   gitweb configuration" section below, and top of 'gitweb.cgi' for their
   full list and description.  If the environment variable GITWEB_CONFIG
   is set when gitweb.cgi is executed, then the file specified in the
   environment variable will be loaded instead of the file specified
   when gitweb.cgi was created.  [Default: gitweb_config.perl]
 * GITWEB_CONFIG_SYSTEM
   This Perl file will be loaded using 'do' as a fallback if GITWEB_CONFIG
   does not exist.  If the environment variable GITWEB_CONFIG_SYSTEM is set
   when gitweb.cgi is executed, then the file specified in the environment
   variable will be loaded instead of the file specified when gitweb.cgi was
   created.  [Default: /etc/gitweb.conf]
 * HIGHLIGHT_BIN
   Path to the highlight executable to use (must be the one from
   http://www.andre-simon.de due to assumptions about parameters and output).
   Useful if highlight is not installed on your webserver's PATH.
   [Default: highlight]

Build example
~~~~~~~~~~~~~

- To install gitweb to /var/www/cgi-bin/gitweb/, when git wrapper
  is installed at /usr/local/bin/git, the repositories (projects)
  we want to display are under /home/local/scm, and you do not use
  minifiers, you can do

	make GITWEB_PROJECTROOT="/home/local/scm" \
	     GITWEB_JS="gitweb/static/gitweb.js" \
	     GITWEB_CSS="gitweb/static/gitweb.css" \
	     GITWEB_LOGO="gitweb/static/git-logo.png" \
	     GITWEB_FAVICON="gitweb/static/git-favicon.png" \
	     bindir=/usr/local/bin \
	     gitweb

	make gitwebdir=/var/www/cgi-bin/gitweb install-gitweb


Gitweb config file
------------------

See also "Runtime gitweb configuration" section in README file
for gitweb (in gitweb/README), and gitweb.conf(5) manpage.

- You can configure gitweb further using the per-instance gitweb configuration file;
  by default this is a file named gitweb_config.perl in the same place as
  gitweb.cgi script. You can control the default place for the config file
  using the GITWEB_CONFIG build configuration variable, and you can set it
  using the GITWEB_CONFIG environment variable. If this file does not
  exist, gitweb looks for a system-wide configuration file, normally
  /etc/gitweb.conf. You can change the default using the
  GITWEB_CONFIG_SYSTEM build configuration variable, and override it
  through the GITWEB_CONFIG_SYSTEM environment variable.

  Note that if per-instance configuration file exists, then system-wide
  configuration is _not used at all_.  This is quite untypical and suprising
  behavior.  On the other hand changing current behavior would break backwards
  compatibility and can lead to unexpected changes in gitweb behavior.
  Therefore gitweb also looks for common system-wide configuration file,
  normally /etc/gitweb-common.conf (set during build time using build time
  configuration variable GITWEB_CONFIG_COMMON, set it at runtime using
  environment variable with the same name).  Settings from per-instance or
  system-wide configuration file override those from common system-wide
  configuration file.

- The gitweb config file is a fragment of perl code. You can set variables
  using "our $variable = value"; text from "#" character until the end
  of a line is ignored. See perlsyn(1) for details.

  See the top of gitweb.perl file for examples of customizable options.

Config file example
~~~~~~~~~~~~~~~~~~~

To enable blame, pickaxe search, and snapshot support, while allowing
individual projects to turn them off, put the following in your
GITWEB_CONFIG file:

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

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

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

If you allow overriding for the snapshot feature, you can specify which
snapshot formats are globally disabled. You can also add any command line
options you want (such as setting the compression level). For instance,
you can disable Zip compressed snapshots and set GZip to run at level 6 by
adding the following lines to your $GITWEB_CONFIG:

	$known_snapshot_formats{'zip'}{'disabled'} = 1;
	$known_snapshot_formats{'tgz'}{'compressor'} = ['gzip','-6'];


Gitweb repositories
-------------------

By default gitweb shows all git repositories under single common repository
root on a local filesystem; see description of GITWEB_PROJECTROOT build-time
configuration variable above (and also of GITWEB_LIST).

More advanced usage, like limiting access or visibility of repositories and
managing multiple roots are described on gitweb manpage.


Example web server configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

See also "Webserver configuration" and "Advanced web server setup" sections
in gitweb(1) manpage.


- Apache2, gitweb installed as CGI script,
  under /var/www/cgi-bin/

	ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

	<Directory "/var/www/cgi-bin">
	    Options Indexes FollowSymlinks ExecCGI
	    AllowOverride None
	    Order allow,deny
	    Allow from all
	</Directory>

- Apache2, gitweb installed as mod_perl legacy script,
  under /var/www/perl/

	Alias /perl "/var/www/perl"

	<Directory "/var/www/perl">
	    SetHandler perl-script
	    PerlResponseHandler ModPerl::Registry
	    PerlOptions +ParseHeaders
	    Options Indexes FollowSymlinks +ExecCGI
	    AllowOverride None
	    Order allow,deny
	    Allow from all
	</Directory>
