made the pack completely portable and wrote relevent bat files to go with it
This commit is contained in:
703
gitportable/mingw64/share/doc/git-doc/gitweb.adoc
Normal file
703
gitportable/mingw64/share/doc/git-doc/gitweb.adoc
Normal file
@@ -0,0 +1,703 @@
|
||||
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
|
||||
Reference in New Issue
Block a user