]>
Commit | Line | Data |
---|---|---|
07ea4df2 JN |
1 | gitweb(1) |
2 | ========= | |
3 | ||
4 | NAME | |
5 | ---- | |
6 | gitweb - Git web interface (web frontend to Git repositories) | |
7 | ||
8 | SYNOPSIS | |
9 | -------- | |
2de9b711 | 10 | To get started with gitweb, run linkgit:git-instaweb[1] from a Git repository. |
07ea4df2 JN |
11 | This would configure and start your web server, and run web browser pointing to |
12 | gitweb. | |
13 | ||
14 | ||
15 | DESCRIPTION | |
16 | ----------- | |
2de9b711 | 17 | Gitweb provides a web interface to Git repositories. Its features include: |
07ea4df2 JN |
18 | |
19 | * Viewing multiple Git repositories with common root. | |
20 | * Browsing every revision of the repository. | |
21 | * Viewing the contents of files in the repository at any revision. | |
22 | * Viewing the revision log of branches, history of files and directories, | |
23 | see what was changed when, by who. | |
24 | * Viewing the blame/annotation details of any file (if enabled). | |
25 | * Generating RSS and Atom feeds of commits, for any branch. | |
26 | The feeds are auto-discoverable in modern web browsers. | |
27 | * Viewing everything that was changed in a revision, and step through | |
28 | revisions one at a time, viewing the history of the repository. | |
29 | * Finding commits which commit messages matches given search term. | |
30 | ||
dfa880e3 | 31 | See http://repo.or.cz/w/git.git/tree/HEAD:/gitweb/[] for gitweb source code, |
07ea4df2 JN |
32 | browsed using gitweb itself. |
33 | ||
34 | ||
35 | CONFIGURATION | |
36 | ------------- | |
37 | Various aspects of gitweb's behavior can be controlled through the configuration | |
68ed71b5 | 38 | file `gitweb_config.perl` or `/etc/gitweb.conf`. See the linkgit:gitweb.conf[5] |
07ea4df2 JN |
39 | for details. |
40 | ||
41 | Repositories | |
42 | ~~~~~~~~~~~~ | |
43 | Gitweb can show information from one or more Git repositories. These | |
44 | repositories have to be all on local filesystem, and have to share common | |
45 | repository root, i.e. be all under a single parent repository (but see also | |
46 | "Advanced web server setup" section, "Webserver configuration with multiple | |
47 | projects' root" subsection). | |
48 | ||
49 | ----------------------------------------------------------------------- | |
50 | our $projectroot = '/path/to/parent/directory'; | |
51 | ----------------------------------------------------------------------- | |
52 | ||
68ed71b5 | 53 | The default value for `$projectroot` is `/pub/git`. You can change it during |
07ea4df2 JN |
54 | building gitweb via `GITWEB_PROJECTROOT` build configuration variable. |
55 | ||
2de9b711 | 56 | By default all Git repositories under `$projectroot` are visible and available |
07ea4df2 | 57 | to gitweb. The list of projects is generated by default by scanning the |
2de9b711 | 58 | `$projectroot` directory for Git repositories (for object databases to be |
07ea4df2 JN |
59 | more exact; gitweb is not interested in a working area, and is best suited |
60 | to showing "bare" repositories). | |
61 | ||
c32c9591 | 62 | The name of the repository in gitweb is the path to its `$GIT_DIR` (its object |
07ea4df2 JN |
63 | database) relative to `$projectroot`. Therefore the repository $repo can be |
64 | found at "$projectroot/$repo". | |
65 | ||
66 | ||
67 | Projects list file format | |
68 | ~~~~~~~~~~~~~~~~~~~~~~~~~ | |
69 | Instead of having gitweb find repositories by scanning filesystem | |
70 | starting from $projectroot, you can provide a pre-generated list of | |
71 | visible projects by setting `$projects_list` to point to a plain text | |
72 | file with a list of projects (with some additional info). | |
73 | ||
74 | This file uses the following format: | |
75 | ||
76 | * One record (for project / repository) per line; does not support line | |
77 | continuation (newline escaping). | |
78 | ||
79 | * Leading and trailing whitespace are ignored. | |
80 | ||
81 | * Whitespace separated fields; any run of whitespace can be used as field | |
82 | separator (rules for Perl's "`split(" ", $line)`"). | |
83 | ||
84 | * Fields use modified URI encoding, defined in RFC 3986, section 2.1 | |
85 | (Percent-Encoding), or rather "Query string encoding" (see | |
5e68729f | 86 | https://en.wikipedia.org/wiki/Query_string#URL_encoding[]), the difference |
07ea4df2 JN |
87 | being that SP (" ") can be encoded as "{plus}" (and therefore "{plus}" has to be |
88 | also percent-encoded). | |
89 | + | |
90 | Reserved characters are: "%" (used for encoding), "{plus}" (can be used to | |
91 | encode SPACE), all whitespace characters as defined in Perl, including SP, | |
92 | TAB and LF, (used to separate fields in a record). | |
93 | ||
94 | * Currently recognized fields are: | |
95 | <repository path>:: | |
96 | path to repository GIT_DIR, relative to `$projectroot` | |
97 | <repository owner>:: | |
98 | displayed as repository owner, preferably full name, or email, | |
99 | or both | |
100 | ||
101 | You can generate the projects list index file using the project_index action | |
102 | (the 'TXT' link on projects list page) directly from gitweb; see also | |
103 | "Generating projects list using gitweb" section below. | |
104 | ||
105 | Example contents: | |
106 | ----------------------------------------------------------------------- | |
107 | foo.git Joe+R+Hacker+<joe@example.com> | |
108 | foo/bar.git O+W+Ner+<owner@example.org> | |
109 | ----------------------------------------------------------------------- | |
110 | ||
111 | ||
112 | By default this file controls only which projects are *visible* on projects | |
2de9b711 | 113 | list page (note that entries that do not point to correctly recognized Git |
07ea4df2 JN |
114 | repositories won't be displayed by gitweb). Even if a project is not |
115 | visible on projects list page, you can view it nevertheless by hand-crafting | |
116 | a gitweb URL. By setting `$strict_export` configuration variable (see | |
117 | linkgit:gitweb.conf[5]) to true value you can allow viewing only of | |
118 | repositories also shown on the overview page (i.e. only projects explicitly | |
119 | listed in projects list file will be accessible). | |
120 | ||
121 | ||
122 | Generating projects list using gitweb | |
123 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
124 | ||
125 | We assume that GITWEB_CONFIG has its default Makefile value, namely | |
126 | 'gitweb_config.perl'. Put the following in 'gitweb_make_index.perl' file: | |
127 | ---------------------------------------------------------------------------- | |
128 | read_config_file("gitweb_config.perl"); | |
129 | $projects_list = $projectroot; | |
130 | ---------------------------------------------------------------------------- | |
131 | ||
132 | Then create the following script to get list of project in the format | |
133 | suitable for GITWEB_LIST build configuration variable (or | |
134 | `$projects_list` variable in gitweb config): | |
135 | ||
136 | ---------------------------------------------------------------------------- | |
137 | #!/bin/sh | |
138 | ||
139 | export GITWEB_CONFIG="gitweb_make_index.perl" | |
140 | export GATEWAY_INTERFACE="CGI/1.1" | |
141 | export HTTP_ACCEPT="*/*" | |
142 | export REQUEST_METHOD="GET" | |
143 | export QUERY_STRING="a=project_index" | |
144 | ||
145 | perl -- /var/www/cgi-bin/gitweb.cgi | |
146 | ---------------------------------------------------------------------------- | |
147 | ||
148 | Run this script and save its output to a file. This file could then be used | |
149 | as projects list file, which means that you can set `$projects_list` to its | |
150 | filename. | |
151 | ||
152 | ||
2de9b711 | 153 | Controlling access to Git repositories |
07ea4df2 | 154 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
2de9b711 | 155 | By default all Git repositories under `$projectroot` are visible and |
07ea4df2 JN |
156 | available to gitweb. You can however configure how gitweb controls access |
157 | to repositories. | |
158 | ||
159 | * As described in "Projects list file format" section, you can control which | |
160 | projects are *visible* by selectively including repositories in projects | |
161 | list file, and setting `$projects_list` gitweb configuration variable to | |
162 | point to it. With `$strict_export` set, projects list file can be used to | |
163 | control which repositories are *available* as well. | |
164 | ||
165 | * You can configure gitweb to only list and allow viewing of the explicitly | |
166 | exported repositories, via `$export_ok` variable in gitweb config file; see | |
167 | linkgit:gitweb.conf[5] manpage. If it evaluates to true, gitweb shows | |
168 | repositories only if this file named by `$export_ok` exists in its object | |
169 | database (if directory has the magic file named `$export_ok`). | |
170 | + | |
171 | For example linkgit:git-daemon[1] by default (unless `--export-all` option | |
172 | is used) allows pulling only for those repositories that have | |
173 | 'git-daemon-export-ok' file. Adding | |
174 | + | |
175 | -------------------------------------------------------------------------- | |
176 | our $export_ok = "git-daemon-export-ok"; | |
177 | -------------------------------------------------------------------------- | |
178 | + | |
179 | makes gitweb show and allow access only to those repositories that can be | |
180 | fetched from via `git://` protocol. | |
181 | ||
182 | * Finally, it is possible to specify an arbitrary perl subroutine that will | |
183 | be called for each repository to determine if it can be exported. The | |
184 | subroutine receives an absolute path to the project (repository) as its only | |
185 | parameter (i.e. "$projectroot/$project"). | |
186 | + | |
187 | For example, if you use mod_perl to run the script, and have dumb | |
188 | HTTP protocol authentication configured for your repositories, you | |
189 | can use the following hook to allow access only if the user is | |
190 | authorized to read the files: | |
191 | + | |
192 | -------------------------------------------------------------------------- | |
193 | $export_auth_hook = sub { | |
194 | use Apache2::SubRequest (); | |
195 | use Apache2::Const -compile => qw(HTTP_OK); | |
196 | my $path = "$_[0]/HEAD"; | |
197 | my $r = Apache2::RequestUtil->request; | |
198 | my $sub = $r->lookup_file($path); | |
199 | return $sub->filename eq $path | |
200 | && $sub->status == Apache2::Const::HTTP_OK; | |
201 | }; | |
202 | -------------------------------------------------------------------------- | |
203 | ||
204 | ||
205 | Per-repository gitweb configuration | |
206 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
207 | You can configure individual repositories shown in gitweb by creating file | |
eee7f4a2 TR |
208 | in the `GIT_DIR` of Git repository, or by setting some repo configuration |
209 | variable (in `GIT_DIR/config`, see linkgit:git-config[1]). | |
07ea4df2 JN |
210 | |
211 | You can use the following files in repository: | |
212 | ||
213 | README.html:: | |
214 | A html file (HTML fragment) which is included on the gitweb project | |
215 | "summary" page inside `<div>` block element. You can use it for longer | |
216 | description of a project, to provide links (for example to project's | |
217 | homepage), etc. This is recognized only if XSS prevention is off | |
218 | (`$prevent_xss` is false, see linkgit:gitweb.conf[5]); a way to include | |
219 | a README safely when XSS prevention is on may be worked out in the | |
220 | future. | |
221 | ||
222 | description (or `gitweb.description`):: | |
223 | Short (shortened to `$projects_list_description_width` in the projects | |
224 | list page, which is 25 characters by default; see | |
225 | linkgit:gitweb.conf[5]) single line description of a project (of a | |
226 | repository). Plain text file; HTML will be escaped. By default set to | |
227 | + | |
228 | ------------------------------------------------------------------------------- | |
229 | Unnamed repository; edit this file to name it for gitweb. | |
230 | ------------------------------------------------------------------------------- | |
231 | + | |
232 | from the template during repository creation, usually installed in | |
68ed71b5 | 233 | `/usr/share/git-core/templates/`. You can use the `gitweb.description` repo |
07ea4df2 JN |
234 | configuration variable, but the file takes precedence. |
235 | ||
236 | category (or `gitweb.category`):: | |
237 | Singe line category of a project, used to group projects if | |
238 | `$projects_list_group_categories` is enabled. By default (file and | |
239 | configuration variable absent), uncategorized projects are put in the | |
240 | `$project_list_default_category` category. You can use the | |
241 | `gitweb.category` repo configuration variable, but the file takes | |
242 | precedence. | |
243 | + | |
244 | The configuration variables `$projects_list_group_categories` and | |
245 | `$project_list_default_category` are described in linkgit:gitweb.conf[5] | |
246 | ||
247 | cloneurl (or multiple-valued `gitweb.url`):: | |
248 | File with repository URL (used for clone and fetch), one per line. | |
249 | Displayed in the project summary page. You can use multiple-valued | |
250 | `gitweb.url` repository configuration variable for that, but the file | |
251 | takes precedence. | |
252 | + | |
253 | This is per-repository enhancement / version of global prefix-based | |
254 | `@git_base_url_list` gitweb configuration variable (see | |
255 | linkgit:gitweb.conf[5]). | |
256 | ||
257 | gitweb.owner:: | |
258 | You can use the `gitweb.owner` repository configuration variable to set | |
259 | repository's owner. It is displayed in the project list and summary | |
260 | page. | |
261 | + | |
262 | If it's not set, filesystem directory's owner is used (via GECOS field, | |
263 | i.e. real name field from *getpwuid*(3)) if `$projects_list` is unset | |
264 | (gitweb scans `$projectroot` for repositories); if `$projects_list` | |
265 | points to file with list of repositories, then project owner defaults to | |
266 | value from this file for given repository. | |
267 | ||
268 | various `gitweb.*` config variables (in config):: | |
269 | Read description of `%feature` hash for detailed list, and descriptions. | |
270 | See also "Configuring gitweb features" section in linkgit:gitweb.conf[5] | |
271 | ||
272 | ||
273 | ACTIONS, AND URLS | |
274 | ----------------- | |
275 | Gitweb can use path_info (component) based URLs, or it can pass all necessary | |
276 | information via query parameters. The typical gitweb URLs are broken down in to | |
277 | five components: | |
278 | ||
279 | ----------------------------------------------------------------------- | |
280 | .../gitweb.cgi/<repo>/<action>/<revision>:/<path>?<arguments> | |
281 | ----------------------------------------------------------------------- | |
282 | ||
283 | repo:: | |
284 | The repository the action will be performed on. | |
285 | + | |
286 | All actions except for those that list all available projects, | |
287 | in whatever form, require this parameter. | |
288 | ||
289 | action:: | |
290 | The action that will be run. Defaults to 'projects_list' if repo | |
291 | is not set, and to 'summary' otherwise. | |
292 | ||
293 | revision:: | |
294 | Revision shown. Defaults to HEAD. | |
295 | ||
296 | path:: | |
297 | The path within the <repository> that the action is performed on, | |
298 | for those actions that require it. | |
299 | ||
300 | arguments:: | |
301 | Any arguments that control the behaviour of the action. | |
302 | ||
303 | Some actions require or allow to specify two revisions, and sometimes even two | |
304 | pathnames. In most general form such path_info (component) based gitweb URL | |
305 | looks like this: | |
306 | ||
307 | ----------------------------------------------------------------------- | |
308 | .../gitweb.cgi/<repo>/<action>/<revision_from>:/<path_from>..<revision_to>:/<path_to>?<arguments> | |
309 | ----------------------------------------------------------------------- | |
310 | ||
311 | ||
312 | Each action is implemented as a subroutine, and must be present in %actions | |
313 | hash. Some actions are disabled by default, and must be turned on via feature | |
314 | mechanism. For example to enable 'blame' view add the following to gitweb | |
315 | configuration file: | |
316 | ||
317 | ----------------------------------------------------------------------- | |
318 | $feature{'blame'}{'default'} = [1]; | |
319 | ----------------------------------------------------------------------- | |
320 | ||
321 | ||
322 | Actions: | |
323 | ~~~~~~~~ | |
324 | The standard actions are: | |
325 | ||
326 | project_list:: | |
327 | Lists the available Git repositories. This is the default command if no | |
328 | repository is specified in the URL. | |
329 | ||
330 | summary:: | |
331 | Displays summary about given repository. This is the default command if | |
332 | no action is specified in URL, and only repository is specified. | |
333 | ||
334 | heads:: | |
335 | remotes:: | |
336 | Lists all local or all remote-tracking branches in given repository. | |
337 | + | |
338 | The latter is not available by default, unless configured. | |
339 | ||
340 | tags:: | |
341 | List all tags (lightweight and annotated) in given repository. | |
342 | ||
343 | blob:: | |
344 | tree:: | |
345 | Shows the files and directories in a given repository path, at given | |
346 | revision. This is default command if no action is specified in the URL, | |
347 | and path is given. | |
348 | ||
349 | blob_plain:: | |
350 | Returns the raw data for the file in given repository, at given path and | |
351 | revision. Links to this action are marked 'raw'. | |
352 | ||
353 | blobdiff:: | |
354 | Shows the difference between two revisions of the same file. | |
355 | ||
356 | blame:: | |
357 | blame_incremental:: | |
358 | Shows the blame (also called annotation) information for a file. On a | |
359 | per line basis it shows the revision in which that line was last changed | |
360 | and the user that committed the change. The incremental version (which | |
361 | if configured is used automatically when JavaScript is enabled) uses | |
362 | Ajax to incrementally add blame info to the contents of given file. | |
363 | + | |
364 | This action is disabled by default for performance reasons. | |
365 | ||
366 | commit:: | |
367 | commitdiff:: | |
368 | Shows information about a specific commit in a repository. The 'commit' | |
369 | view shows information about commit in more detail, the 'commitdiff' | |
370 | action shows changeset for given commit. | |
371 | ||
372 | patch:: | |
373 | Returns the commit in plain text mail format, suitable for applying with | |
374 | linkgit:git-am[1]. | |
375 | ||
376 | tag:: | |
377 | Display specific annotated tag (tag object). | |
378 | ||
379 | log:: | |
380 | shortlog:: | |
381 | Shows log information (commit message or just commit subject) for a | |
382 | given branch (starting from given revision). | |
383 | + | |
384 | The 'shortlog' view is more compact; it shows one commit per line. | |
385 | ||
386 | history:: | |
387 | Shows history of the file or directory in a given repository path, | |
388 | starting from given revision (defaults to HEAD, i.e. default branch). | |
389 | + | |
390 | This view is similar to 'shortlog' view. | |
391 | ||
392 | rss:: | |
393 | atom:: | |
394 | Generates an RSS (or Atom) feed of changes to repository. | |
395 | ||
396 | ||
397 | WEBSERVER CONFIGURATION | |
398 | ----------------------- | |
399 | This section explains how to configure some common webservers to run gitweb. In | |
400 | all cases, `/path/to/gitweb` in the examples is the directory you ran installed | |
401 | gitweb in, and contains `gitweb_config.perl`. | |
402 | ||
403 | If you've configured a web server that isn't listed here for gitweb, please send | |
404 | in the instructions so they can be included in a future release. | |
405 | ||
406 | Apache as CGI | |
407 | ~~~~~~~~~~~~~ | |
408 | Apache must be configured to support CGI scripts in the directory in | |
68ed71b5 | 409 | which gitweb is installed. Let's assume that it is `/var/www/cgi-bin` |
07ea4df2 JN |
410 | directory. |
411 | ||
412 | ----------------------------------------------------------------------- | |
413 | ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" | |
414 | ||
415 | <Directory "/var/www/cgi-bin"> | |
416 | Options Indexes FollowSymlinks ExecCGI | |
417 | AllowOverride None | |
418 | Order allow,deny | |
419 | Allow from all | |
420 | </Directory> | |
421 | ----------------------------------------------------------------------- | |
422 | ||
423 | With that configuration the full path to browse repositories would be: | |
424 | ||
425 | http://server/cgi-bin/gitweb.cgi | |
426 | ||
427 | Apache with mod_perl, via ModPerl::Registry | |
428 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
429 | You can use mod_perl with gitweb. You must install Apache::Registry | |
430 | (for mod_perl 1.x) or ModPerl::Registry (for mod_perl 2.x) to enable | |
431 | this support. | |
432 | ||
68ed71b5 | 433 | Assuming that gitweb is installed to `/var/www/perl`, the following |
07ea4df2 JN |
434 | Apache configuration (for mod_perl 2.x) is suitable. |
435 | ||
436 | ----------------------------------------------------------------------- | |
437 | Alias /perl "/var/www/perl" | |
438 | ||
439 | <Directory "/var/www/perl"> | |
440 | SetHandler perl-script | |
441 | PerlResponseHandler ModPerl::Registry | |
442 | PerlOptions +ParseHeaders | |
443 | Options Indexes FollowSymlinks +ExecCGI | |
444 | AllowOverride None | |
445 | Order allow,deny | |
446 | Allow from all | |
447 | </Directory> | |
448 | ----------------------------------------------------------------------- | |
449 | ||
450 | With that configuration the full path to browse repositories would be: | |
451 | ||
452 | http://server/perl/gitweb.cgi | |
453 | ||
454 | Apache with FastCGI | |
455 | ~~~~~~~~~~~~~~~~~~~ | |
456 | Gitweb works with Apache and FastCGI. First you need to rename, copy | |
457 | or symlink gitweb.cgi to gitweb.fcgi. Let's assume that gitweb is | |
68ed71b5 | 458 | installed in `/usr/share/gitweb` directory. The following Apache |
07ea4df2 JN |
459 | configuration is suitable (UNTESTED!) |
460 | ||
461 | ----------------------------------------------------------------------- | |
462 | FastCgiServer /usr/share/gitweb/gitweb.cgi | |
463 | ScriptAlias /gitweb /usr/share/gitweb/gitweb.cgi | |
464 | ||
465 | Alias /gitweb/static /usr/share/gitweb/static | |
466 | <Directory /usr/share/gitweb/static> | |
467 | SetHandler default-handler | |
468 | </Directory> | |
469 | ----------------------------------------------------------------------- | |
470 | ||
471 | With that configuration the full path to browse repositories would be: | |
472 | ||
473 | http://server/gitweb | |
474 | ||
475 | ||
476 | ADVANCED WEB SERVER SETUP | |
477 | ------------------------- | |
478 | All of those examples use request rewriting, and need `mod_rewrite` | |
479 | (or equivalent; examples below are written for Apache). | |
480 | ||
481 | Single URL for gitweb and for fetching | |
482 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
483 | If you want to have one URL for both gitweb and your `http://` | |
484 | repositories, you can configure Apache like this: | |
485 | ||
486 | ----------------------------------------------------------------------- | |
487 | <VirtualHost *:80> | |
488 | ServerName git.example.org | |
489 | DocumentRoot /pub/git | |
490 | SetEnv GITWEB_CONFIG /etc/gitweb.conf | |
491 | ||
492 | # turning on mod rewrite | |
493 | RewriteEngine on | |
494 | ||
495 | # make the front page an internal rewrite to the gitweb script | |
496 | RewriteRule ^/$ /cgi-bin/gitweb.cgi | |
497 | ||
498 | # make access for "dumb clients" work | |
499 | RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ \ | |
500 | /cgi-bin/gitweb.cgi%{REQUEST_URI} [L,PT] | |
501 | </VirtualHost> | |
502 | ----------------------------------------------------------------------- | |
503 | ||
504 | The above configuration expects your public repositories to live under | |
68ed71b5 | 505 | `/pub/git` and will serve them as `http://git.domain.org/dir-under-pub-git`, |
17b83d71 | 506 | both as clonable Git URL and as browseable gitweb interface. If you then |
07ea4df2 JN |
507 | start your linkgit:git-daemon[1] with `--base-path=/pub/git --export-all` |
508 | then you can even use the `git://` URL with exactly the same path. | |
509 | ||
510 | Setting the environment variable `GITWEB_CONFIG` will tell gitweb to use the | |
68ed71b5 | 511 | named file (i.e. in this example `/etc/gitweb.conf`) as a configuration for |
07ea4df2 JN |
512 | gitweb. You don't really need it in above example; it is required only if |
513 | your configuration file is in different place than built-in (during | |
68ed71b5 | 514 | compiling gitweb) 'gitweb_config.perl' or `/etc/gitweb.conf`. See |
07ea4df2 JN |
515 | linkgit:gitweb.conf[5] for details, especially information about precedence |
516 | rules. | |
517 | ||
518 | If you use the rewrite rules from the example you *might* also need | |
519 | something like the following in your gitweb configuration file | |
68ed71b5 | 520 | (`/etc/gitweb.conf` following example): |
07ea4df2 JN |
521 | ---------------------------------------------------------------------------- |
522 | @stylesheets = ("/some/absolute/path/gitweb.css"); | |
523 | $my_uri = "/"; | |
524 | $home_link = "/"; | |
525 | $per_request_config = 1; | |
526 | ---------------------------------------------------------------------------- | |
527 | Nowadays though gitweb should create HTML base tag when needed (to set base | |
528 | URI for relative links), so it should work automatically. | |
529 | ||
530 | ||
531 | Webserver configuration with multiple projects' root | |
532 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
533 | If you want to use gitweb with several project roots you can edit your | |
534 | Apache virtual host and gitweb configuration files in the following way. | |
535 | ||
536 | The virtual host configuration (in Apache configuration file) should look | |
537 | like this: | |
538 | -------------------------------------------------------------------------- | |
539 | <VirtualHost *:80> | |
540 | ServerName git.example.org | |
541 | DocumentRoot /pub/git | |
542 | SetEnv GITWEB_CONFIG /etc/gitweb.conf | |
543 | ||
544 | # turning on mod rewrite | |
545 | RewriteEngine on | |
546 | ||
547 | # make the front page an internal rewrite to the gitweb script | |
548 | RewriteRule ^/$ /cgi-bin/gitweb.cgi [QSA,L,PT] | |
549 | ||
550 | # look for a public_git folder in unix users' home | |
551 | # http://git.example.org/~<user>/ | |
552 | RewriteRule ^/\~([^\/]+)(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \ | |
553 | [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT] | |
554 | ||
555 | # http://git.example.org/+<user>/ | |
556 | #RewriteRule ^/\+([^\/]+)(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \ | |
557 | [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT] | |
558 | ||
559 | # http://git.example.org/user/<user>/ | |
560 | #RewriteRule ^/user/([^\/]+)/(gitweb.cgi)?$ /cgi-bin/gitweb.cgi \ | |
561 | [QSA,E=GITWEB_PROJECTROOT:/home/$1/public_git/,L,PT] | |
562 | ||
563 | # defined list of project roots | |
564 | RewriteRule ^/scm(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \ | |
565 | [QSA,E=GITWEB_PROJECTROOT:/pub/scm/,L,PT] | |
566 | RewriteRule ^/var(/|/gitweb.cgi)?$ /cgi-bin/gitweb.cgi \ | |
567 | [QSA,E=GITWEB_PROJECTROOT:/var/git/,L,PT] | |
568 | ||
569 | # make access for "dumb clients" work | |
570 | RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ \ | |
571 | /cgi-bin/gitweb.cgi%{REQUEST_URI} [L,PT] | |
572 | </VirtualHost> | |
573 | -------------------------------------------------------------------------- | |
574 | ||
575 | Here actual project root is passed to gitweb via `GITWEB_PROJECT_ROOT` | |
576 | environment variable from a web server, so you need to put the following | |
68ed71b5 | 577 | line in gitweb configuration file (`/etc/gitweb.conf` in above example): |
07ea4df2 JN |
578 | -------------------------------------------------------------------------- |
579 | $projectroot = $ENV{'GITWEB_PROJECTROOT'} || "/pub/git"; | |
580 | -------------------------------------------------------------------------- | |
581 | *Note* that this requires to be set for each request, so either | |
582 | `$per_request_config` must be false, or the above must be put in code | |
583 | referenced by `$per_request_config`; | |
584 | ||
585 | These configurations enable two things. First, each unix user (`<user>`) of | |
2de9b711 | 586 | the server will be able to browse through gitweb Git repositories found in |
68ed71b5 | 587 | `~/public_git/` with the following url: |
07ea4df2 JN |
588 | |
589 | http://git.example.org/~<user>/ | |
590 | ||
591 | If you do not want this feature on your server just remove the second | |
592 | rewrite rule. | |
593 | ||
594 | If you already use `mod_userdir` in your virtual host or you don't want to | |
595 | use the \'~' as first character, just comment or remove the second rewrite | |
596 | rule, and uncomment one of the following according to what you want. | |
597 | ||
68ed71b5 | 598 | Second, repositories found in `/pub/scm/` and `/var/git/` will be accessible |
07ea4df2 JN |
599 | through `http://git.example.org/scm/` and `http://git.example.org/var/`. |
600 | You can add as many project roots as you want by adding rewrite rules like | |
601 | the third and the fourth. | |
602 | ||
603 | ||
604 | PATH_INFO usage | |
605 | ~~~~~~~~~~~~~~~ | |
606 | If you enable PATH_INFO usage in gitweb by putting | |
607 | ---------------------------------------------------------------------------- | |
608 | $feature{'pathinfo'}{'default'} = [1]; | |
609 | ---------------------------------------------------------------------------- | |
610 | in your gitweb configuration file, it is possible to set up your server so | |
611 | that it consumes and produces URLs in the form | |
612 | ||
613 | http://git.example.com/project.git/shortlog/sometag | |
614 | ||
615 | i.e. without 'gitweb.cgi' part, by using a configuration such as the | |
68ed71b5 | 616 | following. This configuration assumes that `/var/www/gitweb` is the |
07ea4df2 JN |
617 | DocumentRoot of your webserver, contains the gitweb.cgi script and |
618 | complementary static files (stylesheet, favicon, JavaScript): | |
619 | ||
620 | ---------------------------------------------------------------------------- | |
621 | <VirtualHost *:80> | |
622 | ServerAlias git.example.com | |
623 | ||
624 | DocumentRoot /var/www/gitweb | |
625 | ||
626 | <Directory /var/www/gitweb> | |
627 | Options ExecCGI | |
628 | AddHandler cgi-script cgi | |
629 | ||
630 | DirectoryIndex gitweb.cgi | |
631 | ||
632 | RewriteEngine On | |
633 | RewriteCond %{REQUEST_FILENAME} !-f | |
634 | RewriteCond %{REQUEST_FILENAME} !-d | |
635 | RewriteRule ^.* /gitweb.cgi/$0 [L,PT] | |
636 | </Directory> | |
637 | </VirtualHost> | |
638 | ---------------------------------------------------------------------------- | |
639 | The rewrite rule guarantees that existing static files will be properly | |
640 | served, whereas any other URL will be passed to gitweb as PATH_INFO | |
641 | parameter. | |
642 | ||
643 | *Notice* that in this case you don't need special settings for | |
644 | `@stylesheets`, `$my_uri` and `$home_link`, but you lose "dumb client" | |
645 | access to your project .git dirs (described in "Single URL for gitweb and | |
646 | for fetching" section). A possible workaround for the latter is the | |
68ed71b5 CB |
647 | following: in your project root dir (e.g. `/pub/git`) have the projects |
648 | named *without* a .git extension (e.g. `/pub/git/project` instead of | |
649 | `/pub/git/project.git`) and configure Apache as follows: | |
07ea4df2 JN |
650 | ---------------------------------------------------------------------------- |
651 | <VirtualHost *:80> | |
652 | ServerAlias git.example.com | |
653 | ||
654 | DocumentRoot /var/www/gitweb | |
655 | ||
656 | AliasMatch ^(/.*?)(\.git)(/.*)?$ /pub/git$1$3 | |
657 | <Directory /var/www/gitweb> | |
658 | Options ExecCGI | |
659 | AddHandler cgi-script cgi | |
660 | ||
661 | DirectoryIndex gitweb.cgi | |
662 | ||
663 | RewriteEngine On | |
664 | RewriteCond %{REQUEST_FILENAME} !-f | |
665 | RewriteCond %{REQUEST_FILENAME} !-d | |
666 | RewriteRule ^.* /gitweb.cgi/$0 [L,PT] | |
667 | </Directory> | |
668 | </VirtualHost> | |
669 | ---------------------------------------------------------------------------- | |
670 | ||
671 | The additional AliasMatch makes it so that | |
672 | ||
673 | http://git.example.com/project.git | |
674 | ||
2de9b711 | 675 | will give raw access to the project's Git dir (so that the project can be |
07ea4df2 JN |
676 | cloned), while |
677 | ||
678 | http://git.example.com/project | |
679 | ||
680 | will provide human-friendly gitweb access. | |
681 | ||
682 | This solution is not 100% bulletproof, in the sense that if some project has | |
68ed71b5 | 683 | a named ref (branch, tag) starting with `git/`, then paths such as |
07ea4df2 JN |
684 | |
685 | http://git.example.com/project/command/abranch..git/abranch | |
686 | ||
687 | will fail with a 404 error. | |
688 | ||
689 | ||
690 | BUGS | |
691 | ---- | |
692 | Please report any bugs or feature requests to git@vger.kernel.org, | |
693 | putting "gitweb" in the subject of email. | |
694 | ||
695 | SEE ALSO | |
696 | -------- | |
697 | linkgit:gitweb.conf[5], linkgit:git-instaweb[1] | |
698 | ||
68ed71b5 | 699 | `gitweb/README`, `gitweb/INSTALL` |
07ea4df2 JN |
700 | |
701 | GIT | |
702 | --- | |
703 | Part of the linkgit:git[1] suite |