git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Docs: web server must setenv GIT_PROTOCOL for v2

From
Jeff King <peff@peff.net>
Date
Sep 8, 2021, 10:48 UTC
Message-ID
<YTiVDo4m5B5RcfCg@coredump.intra.peff.net>
In-Reply-To
<20210907211128.mauwgxupbredgx7w@meerkat.local>
On Tue, Sep 07, 2021 at 05:11:28PM -0400, Konstantin Ryabitsev wrote:
Show 9 quoted lines
> On Sat, Sep 04, 2021 at 11:55:11AM -0400, Jeff King wrote:
> > Unfortunately there isn't any nginx example config there at all yet. If
> > you have kernel.org config you could share, that would be great. But
> > even starting with just the "here's how you do v2" part would be
> > welcome.
> 
> I'll see if I can come up with something to put into
> Documentation/git-http-backend.txt, but I can't right away -- hopefully in
> early October once a bunch of conferences are over.

It would be great if you could add nginx examples at some point. But in the meantime, we can do this much easier patch to make sure we don't forget about mentioning the protocol bits.

-- >8 --
Subject: [PATCH] docs/http-backend: mention v2 protocol

There's a little bit of configuration needed at the webserver level in order to get the client's v2 protocol probes to Git. But when we introduced the v2 protocol, we never documented these explicitly.

Commit 9181c4a9ac (Docs: web server must setenv GIT_PROTOCOL for v2, 2021-09-04) now mentions them in the v2 docs themselves, but users configuring git-over-http for the first time are more likely to be looking in the git-http-backend manpage. Let's make sure we mention it there, too, and give some examples.

Both of the included examples here have been tested to work. The one for lighttpd is a little less direct than I'd like, but I couldn't find a way to directly set an environment variable to the value of a request header. From my reading of the documentation, lighttpd will set HTTP_GIT_PROTOCOL automatically, but git-http-backend looks only at GIT_PROTOCOL. Arguably http-backend should do this translation itself.

Signed-off-by: Jeff King <peff@peff.net>
---
 Documentation/git-http-backend.txt | 13 ++++++++++++-
 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/Documentation/git-http-backend.txt b/Documentation/git-http-backend.txt
index 558966aa83..4797bc8aec 100644
--- a/Documentation/git-http-backend.txt
+++ b/Documentation/git-http-backend.txt
@@ -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
@@ -76,6 +78,7 @@ Apache 2.x::
 ----------------------------------------------------------------
 SetEnv GIT_PROJECT_ROOT /var/www/git
 SetEnv GIT_HTTP_EXPORT_ALL
+SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0
 ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
 ----------------------------------------------------------------
 +
@@ -203,6 +206,9 @@ $HTTP["url"] =~ "^/git" {
 		"GIT_PROJECT_ROOT" => "/var/www/git",
 		"GIT_HTTP_EXPORT_ALL" => ""
 	)
+	$REQUEST_HEADER["Git-Protocol"] == "version=2" {
+		setenv.add-environment += ("GIT_PROTOCOL" => "version=2")
+	}
 }
 ----------------------------------------------------------------
 +
@@ -264,6 +270,11 @@ 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 using the
+`Git-Protocol` HTTP header. In order to support these, the webserver
+must be configured to pass the contents of that header to
+`git-http-backend` in the `GIT_PROTOCOL` environment variable.
+
 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
-- 
2.33.0.621.ga797e945d8
Previous: Konstantin RyabitsevNext: Jeff King
Message 5 of 20 in “Docs: web server must setenv GIT_PROTOCOL for v2”
  1. Docs: web server must setenv GIT_PROTOCOL for v2Konstantin Ryabitsev, Sep 4, 2021
  2. Jeff KingSep 4, 2021
  3. Junio C HamanoSep 7, 2021
  4. Konstantin RyabitsevSep 7, 2021
  5. Jeff KingSep 8, 2021
  6. Jeff KingSep 8, 2021
  7. Eric WongSep 8, 2021
  8. Junio C HamanoSep 9, 2021
  9. Junio C HamanoSep 9, 2021
  10. Jeff KingSep 10, 2021
  11. Jeff KingSep 10, 2021
  12. 1/5 t5551: test v2-to-v0 http protocol fallbackJeff King, Sep 10, 2021
  13. 2/5 http-backend: handle HTTP_GIT_PROTOCOL CGI variableJeff King, Sep 10, 2021
  14. 3/5 docs/http-backend: mention v2 protocolJeff King, Sep 10, 2021
  15. 4/5 docs/git: discuss server-side config for GIT_PROTOCOLJeff King, Sep 10, 2021
  16. 5/5 docs/protocol-v2: point readers transport config discussionJeff King, Sep 10, 2021
  17. Junio C HamanoSep 10, 2021
  18. Philippe BlainSep 9, 2021
  19. Junio C HamanoSep 10, 2021
  20. Jeff KingSep 10, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.