703 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			703 lines
		
	
	
	
		
			26 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 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
 |