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