зеркало из https://github.com/microsoft/git.git
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:
Коммит
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.
|
||||
The program supports clients fetching using both the smart HTTP protocol
|
||||
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
|
||||
"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_HTTP_EXPORT_ALL
|
||||
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,
|
||||
|
@ -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
|
||||
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
|
||||
GIT_COMMITTER_EMAIL to '$\{REMOTE_USER}@http.$\{REMOTE_ADDR\}',
|
||||
ensuring that any reflogs created by 'git-receive-pack' contain some
|
||||
|
|
|
@ -48,6 +48,14 @@ OPTIONS
|
|||
<directory>::
|
||||
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
|
||||
--------
|
||||
linkgit:gitnamespaces[7]
|
||||
|
|
|
@ -894,6 +894,21 @@ for full details.
|
|||
Contains a colon ':' separated list of keys with optional values
|
||||
'key[=value]'. Presence of unknown keys and values must be
|
||||
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`::
|
||||
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
|
||||
`version=2` through the respective side-channel for the transport being
|
||||
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.
|
||||
|
||||
Git Transport
|
||||
|
@ -58,6 +59,8 @@ SSH and File Transport
|
|||
|
||||
When using either the ssh:// or file:// transport, the GIT_PROTOCOL
|
||||
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
|
||||
~~~~~~~~~~~~~~
|
||||
|
@ -84,6 +87,9 @@ Subsequent requests are then made directly to the service
|
|||
Uses the `--http-backend-info-refs` option to
|
||||
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
|
||||
------------------------
|
||||
|
||||
|
|
|
@ -739,6 +739,7 @@ static int bad_request(struct strbuf *hdr, const struct service_cmd *c)
|
|||
int cmd_main(int argc, const char **argv)
|
||||
{
|
||||
char *method = getenv("REQUEST_METHOD");
|
||||
const char *proto_header;
|
||||
char *dir;
|
||||
struct service_cmd *cmd = NULL;
|
||||
char *cmd_arg = NULL;
|
||||
|
@ -789,6 +790,9 @@ int cmd_main(int argc, const char **argv)
|
|||
http_config();
|
||||
max_request_buffer = git_env_ulong("GIT_HTTP_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);
|
||||
return 0;
|
||||
|
|
|
@ -81,8 +81,6 @@ PassEnv GIT_TRACE
|
|||
PassEnv GIT_CONFIG_NOSYSTEM
|
||||
PassEnv GIT_TEST_SIDEBAND_ALL
|
||||
|
||||
SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0
|
||||
|
||||
Alias /dumb/ www/
|
||||
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_HTTP_EXPORT_ALL
|
||||
</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_body/git-upload-pack incomplete-body-upload-pack-v2-http.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
|
||||
'
|
||||
|
||||
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
|
||||
|
|
Загрузка…
Ссылка в новой задаче