Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 1 | git-http-backend(1) |
| 2 | =================== |
| 3 | |
| 4 | NAME |
| 5 | ---- |
| 6 | git-http-backend - Server side implementation of Git over HTTP |
| 7 | |
| 8 | SYNOPSIS |
| 9 | -------- |
| 10 | [verse] |
Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 11 | 'git http-backend' |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 12 | |
| 13 | DESCRIPTION |
| 14 | ----------- |
| 15 | A simple CGI program to serve the contents of a Git repository to Git |
| 16 | clients accessing the repository over http:// and https:// protocols. |
Junio C Hamano | 167b138 | 2010-01-31 23:04:31 | [diff] [blame] | 17 | The program supports clients fetching using both the smart HTTP protocol |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 18 | and the backwards-compatible dumb HTTP protocol, as well as clients |
| 19 | pushing using the smart HTTP protocol. |
| 20 | |
Junio C Hamano | 6ce6b6c | 2010-01-18 01:25:50 | [diff] [blame] | 21 | It verifies that the directory has the magic file |
| 22 | "git-daemon-export-ok", and it will refuse to export any git directory |
| 23 | that hasn't explicitly been marked for export this way (unless the |
| 24 | GIT_HTTP_EXPORT_ALL environmental variable is set). |
| 25 | |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 26 | By default, only the `upload-pack` service is enabled, which serves |
Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 27 | 'git fetch-pack' and 'git ls-remote' clients, which are invoked from |
| 28 | 'git fetch', 'git pull', and 'git clone'. If the client is authenticated, |
| 29 | the `receive-pack` service is enabled, which serves 'git send-pack' |
| 30 | clients, which is invoked from 'git push'. |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 31 | |
| 32 | SERVICES |
| 33 | -------- |
| 34 | These services can be enabled/disabled using the per-repository |
| 35 | configuration file: |
| 36 | |
| 37 | http.getanyfile:: |
Junio C Hamano | 1f630d5 | 2010-04-01 04:49:25 | [diff] [blame^] | 38 | This serves Git clients older than version 1.6.6 that are unable to use the |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 39 | upload pack service. When enabled, clients are able to read |
| 40 | any file within the repository, including objects that are |
| 41 | no longer reachable from a branch but are still present. |
| 42 | It is enabled by default, but a repository can disable it |
| 43 | by setting this configuration item to `false`. |
| 44 | |
| 45 | http.uploadpack:: |
Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 46 | This serves 'git fetch-pack' and 'git ls-remote' clients. |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 47 | It is enabled by default, but a repository can disable it |
| 48 | by setting this configuration item to `false`. |
| 49 | |
| 50 | http.receivepack:: |
Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 51 | This serves 'git send-pack' clients, allowing push. It is |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 52 | disabled by default for anonymous users, and enabled by |
| 53 | default for users authenticated by the web server. It can be |
| 54 | disabled by setting this item to `false`, or enabled for all |
| 55 | users, including anonymous users, by setting it to `true`. |
| 56 | |
| 57 | URL TRANSLATION |
| 58 | --------------- |
Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 59 | To determine the location of the repository on disk, 'git http-backend' |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 60 | concatenates the environment variables PATH_INFO, which is set |
| 61 | automatically by the web server, and GIT_PROJECT_ROOT, which must be set |
| 62 | manually in the web server configuration. If GIT_PROJECT_ROOT is not |
Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 63 | set, 'git http-backend' reads PATH_TRANSLATED, which is also set |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 64 | automatically by the web server. |
| 65 | |
| 66 | EXAMPLES |
| 67 | -------- |
| 68 | All of the following examples map 'http://$hostname/git/foo/bar.git' |
| 69 | to '/var/www/git/foo/bar.git'. |
| 70 | |
| 71 | Apache 2.x:: |
| 72 | Ensure mod_cgi, mod_alias, and mod_env are enabled, set |
| 73 | GIT_PROJECT_ROOT (or DocumentRoot) appropriately, and |
| 74 | create a ScriptAlias to the CGI: |
| 75 | + |
| 76 | ---------------------------------------------------------------- |
| 77 | SetEnv GIT_PROJECT_ROOT /var/www/git |
Junio C Hamano | 6ce6b6c | 2010-01-18 01:25:50 | [diff] [blame] | 78 | SetEnv GIT_HTTP_EXPORT_ALL |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 79 | ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ |
| 80 | ---------------------------------------------------------------- |
| 81 | + |
| 82 | To enable anonymous read access but authenticated write access, |
| 83 | require authorization with a LocationMatch directive: |
| 84 | + |
| 85 | ---------------------------------------------------------------- |
| 86 | <LocationMatch "^/git/.*/git-receive-pack$"> |
| 87 | AuthType Basic |
| 88 | AuthName "Git Access" |
| 89 | Require group committers |
| 90 | ... |
| 91 | </LocationMatch> |
| 92 | ---------------------------------------------------------------- |
| 93 | + |
| 94 | To require authentication for both reads and writes, use a Location |
| 95 | directive around the repository, or one of its parent directories: |
| 96 | + |
| 97 | ---------------------------------------------------------------- |
| 98 | <Location /git/private> |
| 99 | AuthType Basic |
| 100 | AuthName "Private Git Access" |
| 101 | Require group committers |
| 102 | ... |
| 103 | </Location> |
| 104 | ---------------------------------------------------------------- |
| 105 | + |
| 106 | To serve gitweb at the same url, use a ScriptAliasMatch to only |
Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 107 | those URLs that 'git http-backend' can handle, and forward the |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 108 | rest to gitweb: |
| 109 | + |
| 110 | ---------------------------------------------------------------- |
| 111 | ScriptAliasMatch \ |
| 112 | "(?x)^/git/(.*/(HEAD | \ |
| 113 | info/refs | \ |
| 114 | objects/(info/[^/]+ | \ |
| 115 | [0-9a-f]{2}/[0-9a-f]{38} | \ |
| 116 | pack/pack-[0-9a-f]{40}\.(pack|idx)) | \ |
| 117 | git-(upload|receive)-pack))$" \ |
| 118 | /usr/libexec/git-core/git-http-backend/$1 |
| 119 | |
| 120 | ScriptAlias /git/ /var/www/cgi-bin/gitweb.cgi/ |
| 121 | ---------------------------------------------------------------- |
| 122 | |
| 123 | Accelerated static Apache 2.x:: |
| 124 | Similar to the above, but Apache can be used to return static |
| 125 | files that are stored on disk. On many systems this may |
| 126 | be more efficient as Apache can ask the kernel to copy the |
| 127 | file contents from the file system directly to the network: |
| 128 | + |
| 129 | ---------------------------------------------------------------- |
| 130 | SetEnv GIT_PROJECT_ROOT /var/www/git |
| 131 | |
| 132 | AliasMatch ^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$ /var/www/git/$1 |
| 133 | AliasMatch ^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /var/www/git/$1 |
| 134 | ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/ |
| 135 | ---------------------------------------------------------------- |
| 136 | + |
| 137 | This can be combined with the gitweb configuration: |
| 138 | + |
| 139 | ---------------------------------------------------------------- |
| 140 | SetEnv GIT_PROJECT_ROOT /var/www/git |
| 141 | |
| 142 | AliasMatch ^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$ /var/www/git/$1 |
| 143 | AliasMatch ^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /var/www/git/$1 |
| 144 | ScriptAliasMatch \ |
| 145 | "(?x)^/git/(.*/(HEAD | \ |
| 146 | info/refs | \ |
| 147 | objects/info/[^/]+ | \ |
| 148 | git-(upload|receive)-pack))$" \ |
| 149 | /usr/libexec/git-core/git-http-backend/$1 |
| 150 | ScriptAlias /git/ /var/www/cgi-bin/gitweb.cgi/ |
| 151 | ---------------------------------------------------------------- |
| 152 | |
| 153 | |
| 154 | ENVIRONMENT |
| 155 | ----------- |
Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 156 | 'git http-backend' relies upon the CGI environment variables set |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 157 | by the invoking web server, including: |
| 158 | |
| 159 | * PATH_INFO (if GIT_PROJECT_ROOT is set, otherwise PATH_TRANSLATED) |
| 160 | * REMOTE_USER |
| 161 | * REMOTE_ADDR |
| 162 | * CONTENT_TYPE |
| 163 | * QUERY_STRING |
| 164 | * REQUEST_METHOD |
| 165 | |
Junio C Hamano | 6ce6b6c | 2010-01-18 01:25:50 | [diff] [blame] | 166 | The GIT_HTTP_EXPORT_ALL environmental variable may be passed to |
| 167 | 'git-http-backend' to bypass the check for the "git-daemon-export-ok" |
| 168 | file in each repository before allowing export of that repository. |
| 169 | |
Junio C Hamano | 3b70d3c | 2009-11-21 17:37:37 | [diff] [blame] | 170 | The backend process sets GIT_COMMITTER_NAME to '$REMOTE_USER' and |
| 171 | GIT_COMMITTER_EMAIL to '$\{REMOTE_USER}@http.$\{REMOTE_ADDR\}', |
| 172 | ensuring that any reflogs created by 'git-receive-pack' contain some |
| 173 | identifying information of the remote user who performed the push. |
| 174 | |
| 175 | All CGI environment variables are available to each of the hooks |
| 176 | invoked by the 'git-receive-pack'. |
| 177 | |
| 178 | Author |
| 179 | ------ |
| 180 | Written by Shawn O. Pearce <spearce@spearce.org>. |
| 181 | |
| 182 | Documentation |
| 183 | -------------- |
| 184 | Documentation by Shawn O. Pearce <spearce@spearce.org>. |
| 185 | |
| 186 | GIT |
| 187 | --- |
| 188 | Part of the linkgit:git[1] suite |