|  | 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://git.kernel.org/?p=git/git.git;a=tree;f=gitweb[] or | 
|  | 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 |