gitweb(1)
=========

NAME
----
gitweb - Git web interface (web frontend to Git repositories)

SYNOPSIS
--------
To get started with gitweb, run linkgit:git-instaweb[1] from a Git repository.
This would configure and start your web server, and run web browser pointing to
gitweb.


DESCRIPTION
-----------
Gitweb provides a web interface to Git repositories.  Its features include:

* Viewing multiple Git repositories with common root.
* Browsing every revision of the repository.
* Viewing the contents of files in the repository at any revision.
* Viewing the revision log of branches, history of files and directories,
  see what was changed when, by who.
* Viewing the blame/annotation details of any file (if enabled).
* Generating RSS and Atom feeds of commits, for any branch.
  The feeds are auto-discoverable in modern web browsers.
* Viewing everything that was changed in a revision, and step through
  revisions one at a time, viewing the history of the repository.
* Finding commits which commit messages matches given search term.

See http://repo.or.cz/w/git.git/tree/HEAD:/gitweb/[] for gitweb source code,
browsed using gitweb itself.


CONFIGURATION
-------------
Various aspects of gitweb's behavior can be controlled through the configuration
file `gitweb_config.perl` or `/etc/gitweb.conf`.  See the linkgit:gitweb.conf[5]
for details.

Repositories
~~~~~~~~~~~~
Gitweb can show information from one or more Git repositories.  These
repositories have to be all on local filesystem, and have to share common
repository root, i.e. be all under a single parent repository (but see also
"Advanced web server setup" section, "Webserver configuration with multiple
projects' root" subsection).

-----------------------------------------------------------------------
our $projectroot = '/path/to/parent/directory';
-----------------------------------------------------------------------

The default value for `$projectroot` is `/pub/git`.  You can change it during
building gitweb via `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 (for object databases to be
more exact; gitweb is not interested in a working area, and is best suited
to showing "bare" repositories).

The name of the repository in gitweb is the path to its `$GIT_DIR` (its object
database) relative to `$projectroot`.  Therefore the repository $repo can be
found at "$projectroot/$repo".


Projects list file format
~~~~~~~~~~~~~~~~~~~~~~~~~
Instead of having gitweb find repositories by scanning filesystem
starting from $projectroot, you can provide a pre-generated list of
visible projects by setting `$projects_list` to point to a plain text
file with a list of projects (with some additional info).

This file uses the following format:

* One record (for project / repository) per line; does not support line
continuation (newline escaping).

* Leading and trailing whitespace are ignored.

* Whitespace separated fields; any run of whitespace can be used as field
separator (rules for Perl's "`split(" ", $line)`").

* Fields use modified URI encoding, defined in RFC 3986, section 2.1
(Percent-Encoding), or rather "Query string encoding" (see
https://en.wikipedia.org/wiki/Query_string#URL_encoding[]), the difference
being that SP (" ") can be encoded as "{plus}" (and therefore "{plus}" has to be
also percent-encoded).
+
Reserved characters are: "%" (used for encoding), "{plus}" (can be used to
encode SPACE), all whitespace characters as defined in Perl, including SP,
TAB and LF, (used to separate fields in a record).

* Currently recognized fields are:
<repository path>::
	path to repository GIT_DIR, relative to `$projectroot`
<repository owner>::
	displayed as repository owner, preferably full name, or email,
	or both

You can generate the projects list index file using the project_index action
(the 'TXT' link on projects list page) directly from gitweb; see also
"Generating projects list using gitweb" section below.

Example contents:
-----------------------------------------------------------------------
foo.git       Joe+R+Hacker+<joe@example.com>
foo/bar.git   O+W+Ner+<owner@example.org>
-----------------------------------------------------------------------


By default this file controls only which projects are *visible* on projects
list page (note that entries that do not point to correctly recognized Git
repositories won't be displayed by gitweb).  Even if a project is not
visible on projects list page, you can view it nevertheless by hand-crafting
a gitweb URL.  By setting `$strict_export` configuration variable (see
linkgit:gitweb.conf[5]) to true value you can allow viewing only of
repositories also shown on the overview page (i.e. only projects explicitly
listed in projects list file will be accessible).


Generating projects list using gitweb
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

We assume that GITWEB_CONFIG has its default Makefile value, namely
'gitweb_config.perl'. Put the following in 'gitweb_make_index.perl' file:
----------------------------------------------------------------------------
read_config_file("gitweb_config.perl");
$projects_list = $projectroot;
----------------------------------------------------------------------------

Then create the following script to get list of project in the format
suitable for GITWEB_LIST build configuration variable (or
`$projects_list` variable in gitweb config):

----------------------------------------------------------------------------
#!/bin/sh

export GITWEB_CONFIG="gitweb_make_index.perl"
export GATEWAY_INTERFACE="CGI/1.1"
export HTTP_ACCEPT="*/*"
export REQUEST_METHOD="GET"
export QUERY_STRING="a=project_index"

perl -- /var/www/cgi-bin/gitweb.cgi
----------------------------------------------------------------------------

Run this script and save its output to a file.  This file could then be used
as projects list file, which means that you can set `$projects_list` to its
filename.


Controlling access to Git repositories
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
By default all Git repositories under `$projectroot` are visible and
available to gitweb.  You can however configure how gitweb controls access
to repositories.

* As described in "Projects list file format" section, you can control which
projects are *visible* by selectively including repositories in projects
list file, and setting `$projects_list` gitweb configuration variable to
point to it.  With `$strict_export` set, projects list file can be used to
control which repositories are *available* as well.

* You can configure gitweb to only list and allow viewing of the explicitly
exported repositories, via `$export_ok` variable in gitweb config file; see
linkgit:gitweb.conf[5] manpage.  If it evaluates to true, gitweb shows
repositories only if this file named by `$export_ok` exists in its object
database (if directory has the magic file named `$export_ok`).
+
For example linkgit:git-daemon[1] by default (unless `--export-all` option
is used) allows pulling only for those repositories that have
'git-daemon-export-ok' file.  Adding
+
--------------------------------------------------------------------------
our $export_ok = "git-daemon-export-ok";
--------------------------------------------------------------------------
+
makes gitweb show and allow access only to those repositories that can be
fetched from via `git://` protocol.

* Finally, it is possible to specify an arbitrary perl subroutine that will
be called for each repository to determine if it can be exported.  The
subroutine receives an absolute path to the project (repository) as its only
parameter (i.e. "$projectroot/$project").
+
For example, if you use mod_perl to run the script, and have dumb
HTTP protocol authentication configured for your repositories, you
can use the following hook to allow access only if the user is
authorized to read the files:
+
--------------------------------------------------------------------------
$export_auth_hook = sub {
	use Apache2::SubRequest ();
	use Apache2::Const -compile => qw(HTTP_OK);
	my $path = "$_[0]/HEAD";
	my $r    = Apache2::RequestUtil->request;
	my $sub  = $r->lookup_file($path);
	return $sub->filename eq $path
	    && $sub->status == Apache2::Const::HTTP_OK;
};
--------------------------------------------------------------------------


Per-repository gitweb configuration
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can configure individual repositories shown in gitweb by creating file
in the `GIT_DIR` of Git repository, or by setting some repo configuration
variable (in `GIT_DIR/config`, see linkgit:git-config[1]).

You can use the following files in repository:

README.html::
	A html file (HTML fragment) which is included on the gitweb project
	"summary" page inside `<div>` block element. You can use it for longer
	description of a project, to provide links (for example to project's
	homepage), etc. This is recognized only if XSS prevention is off
	(`$prevent_xss` is false, see linkgit:gitweb.conf[5]); a way to include
	a README safely when XSS prevention is on may be worked out in the
	future.

description (or `gitweb.description`)::
	Short (shortened to `$projects_list_description_width` in the projects
	list page, which is 25 characters by default; see
	linkgit:gitweb.conf[5]) single line description of a project (of a
	repository).  Plain text file; HTML will be escaped.  By default set to
+
-------------------------------------------------------------------------------
Unnamed repository; edit this file to name it for gitweb.
-------------------------------------------------------------------------------
+
from the template during repository creation, usually installed in
`/usr/share/git-core/templates/`.  You can use the `gitweb.description` repo
configuration variable, but the file takes precedence.

category (or `gitweb.category`)::
	Singe line category of a project, used to group projects if
	`$projects_list_group_categories` is enabled.  By default (file and
	configuration variable absent), uncategorized projects are put in the
	`$project_list_default_category` category.  You can use the
	`gitweb.category` repo configuration variable, but the file takes
	precedence.
+
The configuration variables `$projects_list_group_categories` and
`$project_list_default_category` are described in linkgit:gitweb.conf[5]

cloneurl (or multiple-valued `gitweb.url`)::
	File with repository URL (used for clone and fetch), one per line.
	Displayed in the project summary page. You can use multiple-valued
	`gitweb.url` repository configuration variable for that, but the file
	takes precedence.
+
This is per-repository enhancement / version of global prefix-based
`@git_base_url_list` gitweb configuration variable (see
linkgit:gitweb.conf[5]).

gitweb.owner::
	You can use the `gitweb.owner` repository configuration variable to set
	repository's owner.  It is displayed in the project list and summary
	page.
+
If it's not set, filesystem directory's owner is used (via GECOS field,
i.e. real name field from *getpwuid*(3)) if `$projects_list` is unset
(gitweb scans `$projectroot` for repositories); if `$projects_list`
points to file with list of repositories, then project owner defaults to
value from this file for given repository.

various `gitweb.*` config variables (in config)::
	Read description of `%feature` hash for detailed list, and descriptions.
	See also "Configuring gitweb features" section in linkgit:gitweb.conf[5]


ACTIONS, AND URLS
-----------------
Gitweb can use path_info (component) based URLs, or it can pass all necessary
information via query parameters.  The typical gitweb URLs are broken down in to
five components:

-----------------------------------------------------------------------
.../gitweb.cgi/<repo>/<action>/<revision>:/<path>?<arguments>
-----------------------------------------------------------------------

repo::
	The repository the action will be performed on.
+
All actions except for those that list all available projects,
in whatever form, require this parameter.

action::
	The action that will be run.  Defaults to 'projects_list' if repo
	is not set, and to 'summary' otherwise.

revision::
	Revision shown.  Defaults to HEAD.

path::
	The path within the <repository> that the action is performed on,
	for those actions that require it.

arguments::
	Any arguments that control the behaviour of the action.

Some actions require or allow to specify two revisions, and sometimes even two
pathnames.  In most general form such path_info (component) based gitweb URL
looks like this:

-----------------------------------------------------------------------
.../gitweb.cgi/<repo>/<action>/<revision_from>:/<path_from>..<revision_to>:/<path_to>?<arguments>
-----------------------------------------------------------------------


Each action is implemented as a subroutine, and must be present in %actions
hash.  Some actions are disabled by default, and must be turned on via feature
mechanism.  For example to enable 'blame' view add the following to gitweb
configuration file:

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


Actions:
~~~~~~~~
The standard actions are:

project_list::
	Lists the available Git repositories.  This is the default command if no
	repository is specified in the URL.

summary::
	Displays summary about given repository.  This is the default command if
	no action is specified in URL, and only repository is specified.

heads::
remotes::
	Lists all local or all remote-tracking branches in given repository.
+
The latter is not available by default, unless configured.

tags::
	List all tags (lightweight and annotated) in given repository.

blob::
tree::
	Shows the files and directories in a given repository path, at given
	revision.  This is default command if no action is specified in the URL,
	and path is given.

blob_plain::
	Returns the raw data for the file in given repository, at given path and
	revision.  Links to this action are marked 'raw'.

blobdiff::
	Shows the difference between two revisions of the same file.

blame::
blame_incremental::
	Shows the blame (also called annotation) information for a file. On a
	per line basis it shows the revision in which that line was last changed
	and the user that committed the change.  The incremental version (which
	if configured is used automatically when JavaScript is enabled) uses
	Ajax to incrementally add blame info to the contents of given file.
+
This action is disabled by default for performance reasons.

commit::
commitdiff::
	Shows information about a specific commit in a repository.  The 'commit'
	view shows information about commit in more detail, the 'commitdiff'
	action shows changeset for given commit.

patch::
	Returns the commit in plain text mail format, suitable for applying with
	linkgit:git-am[1].

tag::
	Display specific annotated tag (tag object).

log::
shortlog::
	Shows log information (commit message or just commit subject) for a
	given branch (starting from given revision).
+
The 'shortlog' view is more compact; it shows one commit per line.

history::
	Shows history of the file or directory in a given repository path,
	starting from given revision (defaults to HEAD, i.e. default branch).
+
This view is similar to 'shortlog' view.

rss::
atom::
	Generates an RSS (or Atom) feed of changes to repository.


WEBSERVER CONFIGURATION
-----------------------
This section explains how to configure some common webservers to run gitweb. In
all cases, `/path/to/gitweb` in the examples is the directory you ran installed
gitweb in, and contains `gitweb_config.perl`.

If you've configured a web server that isn't listed here for gitweb, please send
in the instructions so they can be included in a future release.

Apache as CGI
~~~~~~~~~~~~~
Apache must be configured to support CGI scripts in the directory in
which gitweb is installed.  Let's assume that it is `/var/www/cgi-bin`
directory.

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

With that configuration the full path to browse repositories would be:

  http://server/cgi-bin/gitweb.cgi

Apache with mod_perl, via ModPerl::Registry
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You can use mod_perl with gitweb.  You must install Apache::Registry
(for mod_perl 1.x) or ModPerl::Registry (for mod_perl 2.x) to enable
this support.

Assuming that gitweb is installed to `/var/www/perl`, the following
Apache configuration (for mod_perl 2.x) is suitable.

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

With that configuration the full path to browse repositories would be:

  http://server/perl/gitweb.cgi

Apache with FastCGI
~~~~~~~~~~~~~~~~~~~
Gitweb works with Apache and FastCGI.  First you need to rename, copy
or symlink gitweb.cgi to gitweb.fcgi.  Let's assume that gitweb is
installed in `/usr/share/gitweb` directory.  The following Apache
configuration is suitable (UNTESTED!)

-----------------------------------------------------------------------
FastCgiServer /usr/share/gitweb/gitweb.cgi
ScriptAlias /gitweb /usr/share/gitweb/gitweb.cgi

Alias /gitweb/static /usr/share/gitweb/static
<Directory /usr/share/gitweb/static>
    SetHandler default-handler
</Directory>
-----------------------------------------------------------------------

With that configuration the full path to browse repositories would be:

  http://server/gitweb


ADVANCED WEB SERVER SETUP
-------------------------
All of those examples use request rewriting, and need `mod_rewrite`
(or equivalent; examples below are written for Apache).

Single URL for gitweb and for fetching
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you want to have one URL for both gitweb and your `http://`
repositories, you can configure Apache like this:

-----------------------------------------------------------------------
<VirtualHost *:80>
    ServerName    git.example.org
    DocumentRoot  /pub/git
    SetEnv        GITWEB_CONFIG   /etc/gitweb.conf

    # turning on mod rewrite
    RewriteEngine on

    # make the front page an internal rewrite to the gitweb script
    RewriteRule ^/$  /cgi-bin/gitweb.cgi

    # make access for "dumb clients" work
    RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ \
		/cgi-bin/gitweb.cgi%{REQUEST_URI}  [L,PT]
</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 clonable Git URL and as browseable gitweb interface.  If you then
start your linkgit:git-daemon[1] 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.  You don't really need it in above example; it is required only if
your configuration file is in different place than built-in (during
compiling gitweb) 'gitweb_config.perl' or `/etc/gitweb.conf`.  See
linkgit:gitweb.conf[5] for details, especially information about precedence
rules.

If you use the rewrite rules from the example you *might* also need
something like the following in your gitweb configuration file
(`/etc/gitweb.conf` following example):
----------------------------------------------------------------------------
@stylesheets = ("/some/absolute/path/gitweb.css");
$my_uri    = "/";
$home_link = "/";
$per_request_config = 1;
----------------------------------------------------------------------------
Nowadays though gitweb should create HTML base tag when needed (to set base
URI for relative links), so it should work automatically.


Webserver configuration with multiple projects' root
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
If you want to use gitweb with several project roots you can edit your
Apache virtual host and gitweb configuration files in the following way.

The virtual host configuration (in Apache configuration file) should look
like this:
--------------------------------------------------------------------------
<VirtualHost *:80>
    ServerName    git.example.org
    DocumentRoot  /pub/git
    SetEnv        GITWEB_CONFIG  /etc/gitweb.conf

    # turning on mod rewrite
    RewriteEngine on

    # make the front page an internal rewrite to the gitweb script
    RewriteRule ^/$  /cgi-bin/gitweb.cgi  [QSA,L,PT]

    # look for a public_git folder in unix users' home
    # http://git.example.org/~<user>/
    RewriteRule ^/\~([^\/]+)(/|/gitweb.cgi)?$	/cgi-bin/gitweb.cgi \
		[QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]

    # http://git.example.org/+<user>/
    #RewriteRule ^/\+([^\/]+)(/|/gitweb.cgi)?$	/cgi-bin/gitweb.cgi \
		 [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]

    # http://git.example.org/user/<user>/
    #RewriteRule ^/user/([^\/]+)/(gitweb.cgi)?$	/cgi-bin/gitweb.cgi \
		 [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT]

    # defined list of project roots
    RewriteRule ^/scm(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \
		[QSA,E=GITWEB_PROJECTROOT:/pub/scm/,L,PT]
    RewriteRule ^/var(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \
		[QSA,E=GITWEB_PROJECTROOT:/var/git/,L,PT]

    # make access for "dumb clients" work
    RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ \
		/cgi-bin/gitweb.cgi%{REQUEST_URI}  [L,PT]
</VirtualHost>
--------------------------------------------------------------------------

Here actual project root is passed to gitweb via `GITWEB_PROJECT_ROOT`
environment variable from a web server, so you need to put the following
line in gitweb configuration file (`/etc/gitweb.conf` in above example):
--------------------------------------------------------------------------
$projectroot = $ENV{'GITWEB_PROJECTROOT'} || "/pub/git";
--------------------------------------------------------------------------
*Note* that this requires to be set for each request, so either
`$per_request_config` must be false, or the above must be put in code
referenced by `$per_request_config`;

These configurations enable two things. First, each unix user (`<user>`) of
the server will be able to browse through gitweb Git repositories found in
`~/public_git/` with the following url:

  http://git.example.org/~<user>/

If you do not want this feature on your server just remove the second
rewrite rule.

If you already use `mod_userdir` in your virtual host or you don't want to
use the \'~' as first character, just comment or remove the second rewrite
rule, and uncomment one of the following according to what you want.

Second, repositories found in `/pub/scm/` and `/var/git/` will be accessible
through `http://git.example.org/scm/` and `http://git.example.org/var/`.
You can add as many project roots as you want by adding rewrite rules like
the third and the fourth.


PATH_INFO usage
~~~~~~~~~~~~~~~
If you enable PATH_INFO usage in gitweb by putting
----------------------------------------------------------------------------
$feature{'pathinfo'}{'default'} = [1];
----------------------------------------------------------------------------
in your gitweb configuration file, it is possible to set up your server so
that it consumes and produces URLs in the form

  http://git.example.com/project.git/shortlog/sometag

i.e. without 'gitweb.cgi' part, by using a configuration such as the
following.  This configuration assumes that `/var/www/gitweb` is the
DocumentRoot of your webserver, contains the gitweb.cgi script and
complementary static files (stylesheet, favicon, JavaScript):

----------------------------------------------------------------------------
<VirtualHost *:80>
	ServerAlias git.example.com

	DocumentRoot /var/www/gitweb

	<Directory /var/www/gitweb>
		Options ExecCGI
		AddHandler cgi-script cgi

		DirectoryIndex gitweb.cgi

		RewriteEngine On
		RewriteCond %{REQUEST_FILENAME} !-f
		RewriteCond %{REQUEST_FILENAME} !-d
		RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
	</Directory>
</VirtualHost>
----------------------------------------------------------------------------
The rewrite rule guarantees that existing static files will be properly
served, whereas any other URL will be passed to gitweb as PATH_INFO
parameter.

*Notice* that in this case you don't need special settings for
`@stylesheets`, `$my_uri` and `$home_link`, but you lose "dumb client"
access to your project .git dirs (described in "Single URL for gitweb and
for fetching" section).  A possible workaround for the latter is the
following: in your project root dir (e.g. `/pub/git`) have the projects
named *without* a .git extension (e.g. `/pub/git/project` instead of
`/pub/git/project.git`) and configure Apache as follows:
----------------------------------------------------------------------------
<VirtualHost *:80>
	ServerAlias git.example.com

	DocumentRoot /var/www/gitweb

	AliasMatch ^(/.*?)(\.git)(/.*)?$ /pub/git$1$3
	<Directory /var/www/gitweb>
		Options ExecCGI
		AddHandler cgi-script cgi

		DirectoryIndex gitweb.cgi

		RewriteEngine On
		RewriteCond %{REQUEST_FILENAME} !-f
		RewriteCond %{REQUEST_FILENAME} !-d
		RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
	</Directory>
</VirtualHost>
----------------------------------------------------------------------------

The additional AliasMatch makes it so that

  http://git.example.com/project.git

will give raw access to the project's Git dir (so that the project can be
cloned), while

  http://git.example.com/project

will provide human-friendly gitweb access.

This solution is not 100% bulletproof, in the sense that if some project has
a named ref (branch, tag) starting with `git/`, then paths such as

  http://git.example.com/project/command/abranch..git/abranch

will fail with a 404 error.


BUGS
----
Please report any bugs or feature requests to git@vger.kernel.org,
putting "gitweb" in the subject of email.

SEE ALSO
--------
linkgit:gitweb.conf[5], linkgit:git-instaweb[1]

`gitweb/README`, `gitweb/INSTALL`

GIT
---
Part of the linkgit:git[1] suite
