gitweb / READMEon commit Merge branch 'maint' (d64a09f)
   1GIT web Interface
   2=================
   3
   4The one working on:
   5  http://git.kernel.org/
   6
   7From the git version 1.4.0 gitweb is bundled with git.
   8
   9
  10Runtime gitweb configuration
  11----------------------------
  12
  13You can adjust gitweb behaviour using the file specified in `GITWEB_CONFIG`
  14(defaults to 'gitweb_config.perl' in the same directory as the CGI), and
  15as a fallback `GITWEB_CONFIG_SYSTEM` (defaults to /etc/gitweb.conf).
  16The most notable thing that is not configurable at compile time are the
  17optional features, stored in the '%features' variable.
  18
  19Ultimate description on how to reconfigure the default features setting
  20in your `GITWEB_CONFIG` or per-project in `project.git/config` can be found
  21as comments inside 'gitweb.cgi'.
  22
  23See also the "Gitweb config file" (with an example of config file), and
  24the "Gitweb repositories" sections in INSTALL file for gitweb.
  25
  26
  27The gitweb config file is a fragment of perl code. You can set variables
  28using "our $variable = value"; text from "#" character until the end
  29of a line is ignored. See perlsyn(1) man page for details.
  30
  31Below is the list of variables which you might want to set in gitweb config.
  32See the top of 'gitweb.cgi' for the full list of variables and their
  33descriptions.
  34
  35Gitweb config file variables
  36~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  37
  38You can set, among others, the following variables in gitweb config files
  39(with the exception of $projectroot and $projects_list this list does
  40not include variables usually directly set during build):
  41 * $GIT
  42   Core git executable to use.  By default set to "$GIT_BINDIR/git", which
  43   in turn is by default set to "$(bindir)/git".  If you use git from binary
  44   package, set this to "/usr/bin/git".  This can just be "git" if your
  45   webserver has a sensible PATH.  If you have multiple git versions
  46   installed it can be used to choose which one to use.
  47 * $version
  48   Gitweb version, set automatically when creating gitweb.cgi from
  49   gitweb.perl. You might want to modify it if you are running modified
  50   gitweb.
  51 * $projectroot
  52   Absolute filesystem path which will be prepended to project path;
  53   the path to repository is $projectroot/$project.  Set to
  54   $GITWEB_PROJECTROOT during installation.  This variable have to be
  55   set correctly for gitweb to find repositories.
  56 * $projects_list
  57   Source of projects list, either directory to scan, or text file
  58   with list of repositories (in the "<URI-encoded repository path> SP
  59   <URI-encoded repository owner>" line format; actually there can be
  60   any sequence of whitespace in place of space (SP)).  Set to
  61   $GITWEB_LIST during installation.  If empty, $projectroot is used
  62   to scan for repositories.
  63 * $my_url, $my_uri
  64   Full URL and absolute URL of gitweb script;
  65   in earlier versions of gitweb you might have need to set those
  66   variables, now there should be no need to do it.  See
  67   $per_request_config if you need to set them still.
  68 * $base_url
  69   Base URL for relative URLs in pages generated by gitweb,
  70   (e.g. $logo, $favicon, @stylesheets if they are relative URLs),
  71   needed and used only for URLs with nonempty PATH_INFO via
  72   <base href="$base_url">.  Usually gitweb sets its value correctly,
  73   and there is no need to set this variable, e.g. to $my_uri or "/".
  74   See $per_request_config if you need to set it anyway.
  75 * $home_link
  76   Target of the home link on top of all pages (the first part of view
  77   "breadcrumbs").  By default set to absolute URI of a page ($my_uri).
  78 * @stylesheets
  79   List of URIs of stylesheets (relative to base URI of a page). You
  80   might specify more than one stylesheet, for example use gitweb.css
  81   as base, with site specific modifications in separate stylesheet
  82   to make it easier to upgrade gitweb. You can add 'site' stylesheet
  83   for example by using
  84      push @stylesheets, "gitweb-site.css";
  85   in the gitweb config file.
  86 * $logo_url, $logo_label
  87   URI and label (title) of GIT logo link (or your site logo, if you choose
  88   to use different logo image). By default they point to git homepage;
  89   in the past they pointed to git documentation at www.kernel.org.
  90 * $projects_list_description_width
  91   The width (in characters) of the projects list "Description" column.
  92   Longer descriptions will be cut (trying to cut at word boundary);
  93   full description is available as 'title' attribute (usually shown on
  94   mouseover).  By default set to 25, which might be too small if you
  95   use long project descriptions.
  96 * $projects_list_group_categories
  97   Enables the grouping of projects by category on the project list page.
  98   The category of a project is determined by the $GIT_DIR/category
  99   file or the 'gitweb.category' variable in its repository configuration.
 100   Disabled by default.
 101 * $project_list_default_category
 102   Default category for projects for which none is specified.  If set
 103   to the empty string, such projects will remain uncategorized and
 104   listed at the top, above categorized projects.
 105 * @git_base_url_list
 106   List of git base URLs used for URL to where fetch project from, shown
 107   in project summary page.  Full URL is "$git_base_url/$project".
 108   You can setup multiple base URLs (for example one for  git:// protocol
 109   access, and one for http:// "dumb" protocol access).  Note that per
 110   repository configuration in 'cloneurl' file, or as values of gitweb.url
 111   project config.
 112 * $default_blob_plain_mimetype
 113   Default mimetype for blob_plain (raw) view, if mimetype checking
 114   doesn't result in some other type; by default 'text/plain'.
 115 * $default_text_plain_charset
 116   Default charset for text files. If not set, web server configuration
 117   would be used.
 118 * $mimetypes_file
 119   File to use for (filename extension based) guessing of MIME types before
 120   trying /etc/mime.types. Path, if relative, is taken currently as
 121   relative to the current git repository.
 122 * $fallback_encoding
 123   Gitweb assumes this charset if line contains non-UTF-8 characters.
 124   Fallback decoding is used without error checking, so it can be even
 125   'utf-8'. Value must be valid encoding; see Encoding::Supported(3pm) man
 126   page for a list.   By default 'latin1', aka. 'iso-8859-1'.
 127 * @diff_opts
 128   Rename detection options for git-diff and git-diff-tree. By default
 129   ('-M'); set it to ('-C') or ('-C', '-C') to also detect copies, or
 130   set it to () if you don't want to have renames detection.
 131 * $prevent_xss
 132   If true, some gitweb features are disabled to prevent content in
 133   repositories from launching cross-site scripting (XSS) attacks.  Set this
 134   to true if you don't trust the content of your repositories. The default
 135   is false.
 136 * $maxload
 137   Used to set the maximum load that we will still respond to gitweb queries.
 138   If server load exceed this value then return "503 Service Unavailable" error.
 139   Server load is taken to be 0 if gitweb cannot determine its value.  Set it to
 140   undefined value to turn it off.  The default is 300.
 141 * $highlight_bin
 142   Path to the highlight executable to use (must be the one from
 143   http://www.andre-simon.de due to assumptions about parameters and output).
 144   Useful if highlight is not installed on your webserver's PATH.
 145   [Default: highlight]
 146 * $per_request_config
 147   If set to code reference, it would be run once per each request.  You can
 148   set parts of configuration that change per session, e.g. by setting it to
 149     sub { $ENV{GL_USER} = $cgi->remote_user || "gitweb"; }
 150   Otherwise it is treated as boolean value: if true gitweb would process
 151   config file once per request, if false it would process config file only
 152   once.  Note: $my_url, $my_uri, and $base_url are overwritten with
 153   their default values before every request, so if you want to change
 154   them, be sure to set this variable to true or a code reference effecting
 155   the desired changes.  The default is true.
 156
 157Projects list file format
 158~~~~~~~~~~~~~~~~~~~~~~~~~
 159
 160Instead of having gitweb find repositories by scanning filesystem starting
 161from $projectroot (or $projects_list, if it points to directory), you can
 162provide list of projects by setting $projects_list to a text file with list
 163of projects (and some additional info).  This file uses the following
 164format:
 165
 166One record (for project / repository) per line, whitespace separated fields;
 167does not support (at least for now) lines continuation (newline escaping).
 168Leading and trailing whitespace are ignored, any run of whitespace can be
 169used as field separator (rules for Perl's "split(' ', $line)").  Keyed by
 170the first field, which is project name, i.e. path to repository GIT_DIR
 171relative to $projectroot.  Fields use modified URI encoding, defined in
 172RFC 3986, section 2.1 (Percent-Encoding), or rather "Query string encoding"
 173(see http://en.wikipedia.org/wiki/Query_string#URL_encoding), the difference
 174being that SP (' ') can be encoded as '+' (and therefore '+' has to be also
 175percent-encoded).  Reserved characters are: '%' (used for encoding), '+'
 176(can be used to encode SPACE), all whitespace characters as defined in Perl,
 177including SP, TAB and LF, (used to separate fields in a record).
 178
 179Currently list of fields is
 180 * <repository path>  - path to repository GIT_DIR, relative to $projectroot
 181 * <repository owner> - displayed as repository owner, preferably full name,
 182                        or email, or both
 183
 184You can additionally use $projects_list file to limit which repositories
 185are visible, and together with $strict_export to limit access to
 186repositories (see "Gitweb repositories" section in gitweb/INSTALL).
 187
 188
 189Per-repository gitweb configuration
 190~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 191
 192You can also configure individual repositories shown in gitweb by creating
 193file in the GIT_DIR of git repository, or by setting some repo configuration
 194variable (in GIT_DIR/config).
 195
 196You can use the following files in repository:
 197 * README.html
 198   A .html file (HTML fragment) which is included on the gitweb project
 199   summary page inside <div> block element. You can use it for longer
 200   description of a project, to provide links (for example to project's
 201   homepage), etc. This is recognized only if XSS prevention is off
 202   ($prevent_xss is false); a way to include a readme safely when XSS
 203   prevention is on may be worked out in the future.
 204 * description (or gitweb.description)
 205   Short (shortened by default to 25 characters in the projects list page)
 206   single line description of a project (of a repository). Plain text file;
 207   HTML will be escaped. By default set to
 208     Unnamed repository; edit this file to name it for gitweb.
 209   from the template during repository creation. You can use the
 210   gitweb.description repo configuration variable, but the file takes
 211   precedence.
 212 * category (or gitweb.category)
 213   Singe line category of a project, used to group projects if
 214   $projects_list_group_categories is enabled. By default (file and
 215   configuration variable absent), uncategorized projects are put in
 216   the $project_list_default_category category. You can use the
 217   gitweb.category repo configuration variable, but the file takes
 218   precedence.
 219 * cloneurl (or multiple-valued gitweb.url)
 220   File with repository URL (used for clone and fetch), one per line.
 221   Displayed in the project summary page. You can use multiple-valued
 222   gitweb.url repository configuration variable for that, but the file
 223   takes precedence.
 224 * gitweb.owner
 225   You can use the gitweb.owner repository configuration variable to set
 226   repository's owner. It is displayed in the project list and summary
 227   page. If it's not set, filesystem directory's owner is used
 228   (via GECOS field / real name field from getpwiud(3)).
 229 * various gitweb.* config variables (in config)
 230   Read description of %feature hash for detailed list, and some
 231   descriptions.
 232
 233
 234Webserver configuration
 235-----------------------
 236
 237If you want to have one URL for both gitweb and your http://
 238repositories, you can configure apache like this:
 239
 240<VirtualHost *:80>
 241    ServerName          git.example.org
 242    DocumentRoot        /pub/git
 243    SetEnv                      GITWEB_CONFIG   /etc/gitweb.conf
 244
 245    # turning on mod rewrite
 246    RewriteEngine on
 247
 248    # make the front page an internal rewrite to the gitweb script
 249    RewriteRule ^/$  /cgi-bin/gitweb.cgi
 250
 251    # make access for "dumb clients" work
 252    RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ /cgi-bin/gitweb.cgi%{REQUEST_URI}  [L,PT]
 253</VirtualHost>
 254
 255The above configuration expects your public repositories to live under
 256/pub/git and will serve them as http://git.domain.org/dir-under-pub-git,
 257both as cloneable GIT URL and as browseable gitweb interface.
 258If you then start your git-daemon with --base-path=/pub/git --export-all
 259then you can even use the git:// URL with exactly the same path.
 260
 261Setting the environment variable GITWEB_CONFIG will tell gitweb to use
 262the named file (i.e. in this example /etc/gitweb.conf) as a
 263configuration for gitweb.  Perl variables defined in here will
 264override the defaults given at the head of the gitweb.perl (or
 265gitweb.cgi).  Look at the comments in that file for information on
 266which variables and what they mean.
 267
 268If you use the rewrite rules from the example you'll likely also need
 269something like the following in your gitweb.conf (or gitweb_config.perl) file:
 270
 271  @stylesheets = ("/some/absolute/path/gitweb.css");
 272  $my_uri = "/";
 273  $home_link = "/";
 274
 275
 276Webserver configuration with multiple projects' root
 277----------------------------------------------------
 278
 279If you want to use gitweb with several project roots you can edit your apache
 280virtual host and gitweb.conf configuration files like this :
 281
 282virtual host configuration :
 283
 284<VirtualHost *:80>
 285    ServerName                  git.example.org
 286    DocumentRoot                /pub/git
 287    SetEnv                              GITWEB_CONFIG   /etc/gitweb.conf
 288
 289    # turning on mod rewrite
 290    RewriteEngine on
 291
 292    # make the front page an internal rewrite to the gitweb script
 293    RewriteRule ^/$             /cgi-bin/gitweb.cgi [QSA,L,PT]
 294
 295    # look for a public_git folder in unix users' home
 296    # http://git.example.org/~<user>/
 297    RewriteRule ^/\~([^\/]+)(/|/gitweb.cgi)?$   /cgi-bin/gitweb.cgi [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]
 298
 299    # http://git.example.org/+<user>/
 300    #RewriteRule ^/\+([^\/]+)(/|/gitweb.cgi)?$  /cgi-bin/gitweb.cgi [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]
 301
 302    # http://git.example.org/user/<user>/
 303    #RewriteRule ^/user/([^\/]+)/(gitweb.cgi)?$ /cgi-bin/gitweb.cgi [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]
 304
 305    # defined list of project roots
 306    RewriteRule ^/scm(/|/gitweb.cgi)?$          /cgi-bin/gitweb.cgi [QSA,E=GITWEB_PROJECTROOT:/pub/scm/,L,PT]
 307    RewriteRule ^/var(/|/gitweb.cgi)?$          /cgi-bin/gitweb.cgi [QSA,E=GITWEB_PROJECTROOT:/var/git/,L,PT]
 308
 309    # make access for "dumb clients" work
 310    RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ /cgi-bin/gitweb.cgi%{REQUEST_URI}  [L,PT]
 311</VirtualHost>
 312
 313gitweb.conf configuration :
 314
 315$projectroot = $ENV{'GITWEB_PROJECTROOT'} || "/pub/git";
 316
 317These configurations enable two things. First, each unix user (<user>) of the
 318server will be able to browse through gitweb git repositories found in
 319~/public_git/ with the following url : http://git.example.org/~<user>/
 320
 321If you do not want this feature on your server just remove the second rewrite rule.
 322
 323If you already use mod_userdir in your virtual host or you don't want to use
 324the '~' as first character just comment or remove the second rewrite rule and
 325uncomment one of the following according to what you want.
 326
 327Second, repositories found in /pub/scm/ and /var/git/ will be accesible
 328through http://git.example.org/scm/ and http://git.example.org/var/.
 329You can add as many project roots as you want by adding rewrite rules like the
 330third and the fourth.
 331
 332
 333PATH_INFO usage
 334-----------------------
 335If you enable PATH_INFO usage in gitweb by putting
 336
 337   $feature{'pathinfo'}{'default'} = [1];
 338
 339in your gitweb.conf, it is possible to set up your server so that it
 340consumes and produces URLs in the form
 341
 342http://git.example.com/project.git/shortlog/sometag
 343
 344by using a configuration such as the following, that assumes that
 345/var/www/gitweb is the DocumentRoot of your webserver, and that it
 346contains the gitweb.cgi script and complementary static files
 347(stylesheet, favicon):
 348
 349<VirtualHost *:80>
 350        ServerAlias git.example.com
 351
 352        DocumentRoot /var/www/gitweb
 353
 354        <Directory /var/www/gitweb>
 355                Options ExecCGI
 356                AddHandler cgi-script cgi
 357
 358                DirectoryIndex gitweb.cgi
 359
 360                RewriteEngine On
 361                RewriteCond %{REQUEST_FILENAME} !-f
 362                RewriteCond %{REQUEST_FILENAME} !-d
 363                RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
 364        </Directory>
 365</VirtualHost>
 366
 367The rewrite rule guarantees that existing static files will be properly
 368served, whereas any other URL will be passed to gitweb as PATH_INFO
 369parameter.
 370
 371Notice that in this case you don't need special settings for
 372@stylesheets, $my_uri and $home_link, but you lose "dumb client" access
 373to your project .git dirs. A possible workaround for the latter is the
 374following: in your project root dir (e.g. /pub/git) have the projects
 375named without a .git extension (e.g. /pub/git/project instead of
 376/pub/git/project.git) and configure Apache as follows:
 377
 378<VirtualHost *:80>
 379        ServerAlias git.example.com
 380
 381        DocumentRoot /var/www/gitweb
 382
 383        AliasMatch ^(/.*?)(\.git)(/.*)?$ /pub/git$1$3
 384        <Directory /var/www/gitweb>
 385                Options ExecCGI
 386                AddHandler cgi-script cgi
 387
 388                DirectoryIndex gitweb.cgi
 389
 390                RewriteEngine On
 391                RewriteCond %{REQUEST_FILENAME} !-f
 392                RewriteCond %{REQUEST_FILENAME} !-d
 393                RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
 394        </Directory>
 395</VirtualHost>
 396
 397The additional AliasMatch makes it so that
 398
 399http://git.example.com/project.git
 400
 401will give raw access to the project's git dir (so that the project can
 402be cloned), while
 403
 404http://git.example.com/project
 405
 406will provide human-friendly gitweb access.
 407
 408This solution is not 100% bulletproof, in the sense that if some project
 409has a named ref (branch, tag) starting with 'git/', then paths such as
 410
 411http://git.example.com/project/command/abranch..git/abranch
 412
 413will fail with a 404 error.
 414
 415
 416
 417Originally written by:
 418  Kay Sievers <kay.sievers@vrfy.org>
 419
 420Any comment/question/concern to:
 421  Git mailing list <git@vger.kernel.org>