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