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 fallbackmaint
						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. | ||||
| 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 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano