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 will configure and start your web server, and run a 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,
  seeing what was changed, when, and by whom.
* 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 stepping through
  revisions one at a time, viewing the history of the repository.
* Finding commits whose commit messages match a given search term.

See https://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 a common
repository root, i.e. be all under a single parent repository (but see also
the "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 the `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 the 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`)::
	Single 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 browsable 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 directory 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
