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 surprising
  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>
