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