Merge branch 'jk/http-server-protocol-versions'
Taking advantage of the CGI interface, http-backend has been updated to enable protocol v2 automatically when the other side asks for it. * jk/http-server-protocol-versions: docs/protocol-v2: point readers transport config discussion docs/git: discuss server-side config for GIT_PROTOCOL docs/http-backend: mention v2 protocol http-backend: handle HTTP_GIT_PROTOCOL CGI variable t5551: test v2-to-v0 http protocol fallback
This commit is contained in:
commit
cabb41d0f6
@ -16,7 +16,9 @@ A simple CGI program to serve the contents of a Git repository to Git
|
|||||||
clients accessing the repository over http:// and https:// protocols.
|
clients accessing the repository over http:// and https:// protocols.
|
||||||
The program supports clients fetching using both the smart HTTP protocol
|
The program supports clients fetching using both the smart HTTP protocol
|
||||||
and the backwards-compatible dumb HTTP protocol, as well as clients
|
and the backwards-compatible dumb HTTP protocol, as well as clients
|
||||||
pushing using the smart HTTP protocol.
|
pushing using the smart HTTP protocol. It also supports Git's
|
||||||
|
more-efficient "v2" protocol if properly configured; see the
|
||||||
|
discussion of `GIT_PROTOCOL` in the ENVIRONMENT section below.
|
||||||
|
|
||||||
It verifies that the directory has the magic file
|
It verifies that the directory has the magic file
|
||||||
"git-daemon-export-ok", and it will refuse to export any Git directory
|
"git-daemon-export-ok", and it will refuse to export any Git directory
|
||||||
@ -77,6 +79,18 @@ Apache 2.x::
|
|||||||
SetEnv GIT_PROJECT_ROOT /var/www/git
|
SetEnv GIT_PROJECT_ROOT /var/www/git
|
||||||
SetEnv GIT_HTTP_EXPORT_ALL
|
SetEnv GIT_HTTP_EXPORT_ALL
|
||||||
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
|
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
|
||||||
|
|
||||||
|
# This is not strictly necessary using Apache and a modern version of
|
||||||
|
# git-http-backend, as the webserver will pass along the header in the
|
||||||
|
# environment as HTTP_GIT_PROTOCOL, and http-backend will copy that into
|
||||||
|
# GIT_PROTOCOL. But you may need this line (or something similar if you
|
||||||
|
# are using a different webserver), or if you want to support older Git
|
||||||
|
# versions that did not do that copying.
|
||||||
|
#
|
||||||
|
# Having the webserver set up GIT_PROTOCOL is perfectly fine even with
|
||||||
|
# modern versions (and will take precedence over HTTP_GIT_PROTOCOL,
|
||||||
|
# which means it can be used to override the client's request).
|
||||||
|
SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
+
|
+
|
||||||
To enable anonymous read access but authenticated write access,
|
To enable anonymous read access but authenticated write access,
|
||||||
@ -264,6 +278,16 @@ a repository with an extremely large number of refs. The value can be
|
|||||||
specified with a unit (e.g., `100M` for 100 megabytes). The default is
|
specified with a unit (e.g., `100M` for 100 megabytes). The default is
|
||||||
10 megabytes.
|
10 megabytes.
|
||||||
|
|
||||||
|
Clients may probe for optional protocol capabilities (like the v2
|
||||||
|
protocol) using the `Git-Protocol` HTTP header. In order to support
|
||||||
|
these, the contents of that header must appear in the `GIT_PROTOCOL`
|
||||||
|
environment variable. Most webservers will pass this header to the CGI
|
||||||
|
via the `HTTP_GIT_PROTOCOL` variable, and `git-http-backend` will
|
||||||
|
automatically copy that to `GIT_PROTOCOL`. However, some webservers may
|
||||||
|
be more selective about which headers they'll pass, in which case they
|
||||||
|
need to be configured explicitly (see the mention of `Git-Protocol` in
|
||||||
|
the Apache config from the earlier EXAMPLES section).
|
||||||
|
|
||||||
The backend process sets GIT_COMMITTER_NAME to '$REMOTE_USER' and
|
The backend process sets GIT_COMMITTER_NAME to '$REMOTE_USER' and
|
||||||
GIT_COMMITTER_EMAIL to '$\{REMOTE_USER}@http.$\{REMOTE_ADDR\}',
|
GIT_COMMITTER_EMAIL to '$\{REMOTE_USER}@http.$\{REMOTE_ADDR\}',
|
||||||
ensuring that any reflogs created by 'git-receive-pack' contain some
|
ensuring that any reflogs created by 'git-receive-pack' contain some
|
||||||
|
@ -48,6 +48,14 @@ OPTIONS
|
|||||||
<directory>::
|
<directory>::
|
||||||
The repository to sync from.
|
The repository to sync from.
|
||||||
|
|
||||||
|
ENVIRONMENT
|
||||||
|
-----------
|
||||||
|
|
||||||
|
`GIT_PROTOCOL`::
|
||||||
|
Internal variable used for handshaking the wire protocol. Server
|
||||||
|
admins may need to configure some transports to allow this
|
||||||
|
variable to be passed. See the discussion in linkgit:git[1].
|
||||||
|
|
||||||
SEE ALSO
|
SEE ALSO
|
||||||
--------
|
--------
|
||||||
linkgit:gitnamespaces[7]
|
linkgit:gitnamespaces[7]
|
||||||
|
@ -894,6 +894,21 @@ for full details.
|
|||||||
Contains a colon ':' separated list of keys with optional values
|
Contains a colon ':' separated list of keys with optional values
|
||||||
'key[=value]'. Presence of unknown keys and values must be
|
'key[=value]'. Presence of unknown keys and values must be
|
||||||
ignored.
|
ignored.
|
||||||
|
+
|
||||||
|
Note that servers may need to be configured to allow this variable to
|
||||||
|
pass over some transports. It will be propagated automatically when
|
||||||
|
accessing local repositories (i.e., `file://` or a filesystem path), as
|
||||||
|
well as over the `git://` protocol. For git-over-http, it should work
|
||||||
|
automatically in most configurations, but see the discussion in
|
||||||
|
linkgit:git-http-backend[1]. For git-over-ssh, the ssh server may need
|
||||||
|
to be configured to allow clients to pass this variable (e.g., by using
|
||||||
|
`AcceptEnv GIT_PROTOCOL` with OpenSSH).
|
||||||
|
+
|
||||||
|
This configuration is optional. If the variable is not propagated, then
|
||||||
|
clients will fall back to the original "v0" protocol (but may miss out
|
||||||
|
on some performance improvements or features). This variable currently
|
||||||
|
only affects clones and fetches; it is not yet used for pushes (but may
|
||||||
|
be in the future).
|
||||||
|
|
||||||
`GIT_OPTIONAL_LOCKS`::
|
`GIT_OPTIONAL_LOCKS`::
|
||||||
If set to `0`, Git will complete any requested operation without
|
If set to `0`, Git will complete any requested operation without
|
||||||
|
@ -42,7 +42,8 @@ Initial Client Request
|
|||||||
In general a client can request to speak protocol v2 by sending
|
In general a client can request to speak protocol v2 by sending
|
||||||
`version=2` through the respective side-channel for the transport being
|
`version=2` through the respective side-channel for the transport being
|
||||||
used which inevitably sets `GIT_PROTOCOL`. More information can be
|
used which inevitably sets `GIT_PROTOCOL`. More information can be
|
||||||
found in `pack-protocol.txt` and `http-protocol.txt`. In all cases the
|
found in `pack-protocol.txt` and `http-protocol.txt`, as well as the
|
||||||
|
`GIT_PROTOCOL` definition in `git.txt`. In all cases the
|
||||||
response from the server is the capability advertisement.
|
response from the server is the capability advertisement.
|
||||||
|
|
||||||
Git Transport
|
Git Transport
|
||||||
@ -58,6 +59,8 @@ SSH and File Transport
|
|||||||
|
|
||||||
When using either the ssh:// or file:// transport, the GIT_PROTOCOL
|
When using either the ssh:// or file:// transport, the GIT_PROTOCOL
|
||||||
environment variable must be set explicitly to include "version=2".
|
environment variable must be set explicitly to include "version=2".
|
||||||
|
The server may need to be configured to allow this environment variable
|
||||||
|
to pass.
|
||||||
|
|
||||||
HTTP Transport
|
HTTP Transport
|
||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
@ -84,6 +87,9 @@ Subsequent requests are then made directly to the service
|
|||||||
Uses the `--http-backend-info-refs` option to
|
Uses the `--http-backend-info-refs` option to
|
||||||
linkgit:git-upload-pack[1].
|
linkgit:git-upload-pack[1].
|
||||||
|
|
||||||
|
The server may need to be configured to pass this header's contents via
|
||||||
|
the `GIT_PROTOCOL` variable. See the discussion in `git-http-backend.txt`.
|
||||||
|
|
||||||
Capability Advertisement
|
Capability Advertisement
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
|
@ -739,6 +739,7 @@ static int bad_request(struct strbuf *hdr, const struct service_cmd *c)
|
|||||||
int cmd_main(int argc, const char **argv)
|
int cmd_main(int argc, const char **argv)
|
||||||
{
|
{
|
||||||
char *method = getenv("REQUEST_METHOD");
|
char *method = getenv("REQUEST_METHOD");
|
||||||
|
const char *proto_header;
|
||||||
char *dir;
|
char *dir;
|
||||||
struct service_cmd *cmd = NULL;
|
struct service_cmd *cmd = NULL;
|
||||||
char *cmd_arg = NULL;
|
char *cmd_arg = NULL;
|
||||||
@ -789,6 +790,9 @@ int cmd_main(int argc, const char **argv)
|
|||||||
http_config();
|
http_config();
|
||||||
max_request_buffer = git_env_ulong("GIT_HTTP_MAX_REQUEST_BUFFER",
|
max_request_buffer = git_env_ulong("GIT_HTTP_MAX_REQUEST_BUFFER",
|
||||||
max_request_buffer);
|
max_request_buffer);
|
||||||
|
proto_header = getenv("HTTP_GIT_PROTOCOL");
|
||||||
|
if (proto_header)
|
||||||
|
setenv(GIT_PROTOCOL_ENVIRONMENT, proto_header, 0);
|
||||||
|
|
||||||
cmd->imp(&hdr, cmd_arg);
|
cmd->imp(&hdr, cmd_arg);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -81,8 +81,6 @@ PassEnv GIT_TRACE
|
|||||||
PassEnv GIT_CONFIG_NOSYSTEM
|
PassEnv GIT_CONFIG_NOSYSTEM
|
||||||
PassEnv GIT_TEST_SIDEBAND_ALL
|
PassEnv GIT_TEST_SIDEBAND_ALL
|
||||||
|
|
||||||
SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0
|
|
||||||
|
|
||||||
Alias /dumb/ www/
|
Alias /dumb/ www/
|
||||||
Alias /auth/dumb/ www/auth/dumb/
|
Alias /auth/dumb/ www/auth/dumb/
|
||||||
|
|
||||||
@ -117,6 +115,11 @@ Alias /auth/dumb/ www/auth/dumb/
|
|||||||
SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH}
|
SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH}
|
||||||
SetEnv GIT_HTTP_EXPORT_ALL
|
SetEnv GIT_HTTP_EXPORT_ALL
|
||||||
</LocationMatch>
|
</LocationMatch>
|
||||||
|
<LocationMatch /smart_v0/>
|
||||||
|
SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH}
|
||||||
|
SetEnv GIT_HTTP_EXPORT_ALL
|
||||||
|
SetEnv GIT_PROTOCOL
|
||||||
|
</LocationMatch>
|
||||||
ScriptAlias /smart/incomplete_length/git-upload-pack incomplete-length-upload-pack-v2-http.sh/
|
ScriptAlias /smart/incomplete_length/git-upload-pack incomplete-length-upload-pack-v2-http.sh/
|
||||||
ScriptAlias /smart/incomplete_body/git-upload-pack incomplete-body-upload-pack-v2-http.sh/
|
ScriptAlias /smart/incomplete_body/git-upload-pack incomplete-body-upload-pack-v2-http.sh/
|
||||||
ScriptAliasMatch /error_git_upload_pack/(.*)/git-upload-pack error.sh/
|
ScriptAliasMatch /error_git_upload_pack/(.*)/git-upload-pack error.sh/
|
||||||
|
@ -558,4 +558,13 @@ test_expect_success 'http auth forgets bogus credentials' '
|
|||||||
expect_askpass both user@host
|
expect_askpass both user@host
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'client falls back from v2 to v0 to match server' '
|
||||||
|
GIT_TRACE_PACKET=$PWD/trace \
|
||||||
|
GIT_TEST_PROTOCOL_VERSION=2 \
|
||||||
|
git clone $HTTPD_URL/smart_v0/repo.git repo-v0 &&
|
||||||
|
# check for v0; there the HEAD symref is communicated in the capability
|
||||||
|
# line; v2 uses a different syntax on each ref advertisement line
|
||||||
|
grep symref=HEAD:refs/heads/ trace
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user