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

Re: Weird interaction between Git protocol versions and git:// and https:// URLs (was: Re: Bug with Git shallow clones and submodules)

From
Jeff King <peff@peff.net>
Date
Sep 4, 2021, 12:57 UTC
Message-ID
<YTNtVJy6sCfQ7T3L@coredump.intra.peff.net>
In-Reply-To
<542a68a5-d439-921e-2691-bb8890584f27@gmail.com>
On Thu, Sep 02, 2021 at 09:49:38AM -0400, Philippe Blain wrote:
Show 25 quoted lines
> > OK, it's running Git 2.20.1. And the list of capabilities above implies that it's responding
> > with protocol v0, even if my local Git version if 2.29, which defaults to protocol v2. If
> > it were responding with protocol v2, we would see:
> > 
> > $ GIT_TRACE_PACKET=1 GIT_TRACE_BARE=1 git ls-remote https://github.com/git/git 2>&1 | grep agent
> > packet:          git< agent=git/github-g78b452413e8b  # server version
> > packet:          git< agent=git/github-g78b452413e8b
> > packet:          git> agent=git/2.29.2  # client version
> > packet:          git< agent=git/2.29.2
> > 
> > And grepping for "version" would confirm it:
> > 
> > $ GIT_TRACE_PACKET=1 GIT_TRACE_BARE=1 git ls-remote https://github.com/git/git 2>&1 | grep version
> > packet:          git< version 2
> > packet:          git< version 2
> > 
> > I can't explain why the server refuses to talk with protocol v2. Maybe Jonathan (CC-ed),
> > who worked on the implementation of protocol v2, would be able to explain that.
> 
> I'm sorry to bump this, but I would really like to understand what is going on here.
> I'm not familiar at all with the protocol code, but my understanding was that after
> Git 2.18, if a client requested protocol v2, the server would answer with v2 (at least
> for git:// and http[s]://, and also for ssh:// if AcceptEnv is correctly configured).
> Here, Git 2.20.1 at https://dpdk.org/git/dpdk-stable answers with v0 for https://,
> but with v2 for git:// !

The server has to be configured correctly at the HTTP level, too. The v2 probe for HTTP is a "Git-Protocol: version=2" header in the HTTP request. The webserver has to be configured to communicate that to the rest of Git somehow. In our test setup for Apache, we do:

  SetEnvIf Git-Protocol ".*" GIT_PROTOCOL=$0

If that doesn't happen, then the server doesn't see the header at all, and just speaks v0 as usual.

I suspect this could be better documented. I have to admit that I have not actually run a regular HTTP server with Git in a long time (at GitHub, we have our own custom layer that terminates the HTTP connections).

-Peff
Previous: Philippe BlainNext: Konstantin Ryabitsev
Message 4 of 5 in “Bug with Git shallow clones and submodules”
  1. Kevin PhillipsAug 11, 2021
  2. Philippe BlainAug 15, 2021
  3. Weird interaction between Git protocol versions and git:// and https:// URLs (was: Re: Bug with Git shallow clones and submodules)Philippe Blain, Sep 2, 2021
  4. Jeff KingSep 4, 2021
  5. Konstantin RyabitsevSep 4, 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.