[PATCH 0/3] Introduce a 'fromAccepted' option to GIT_NO_LAZY_FETCH
- From
Christian Couder <christian.couder@gmail.com>
- Date
- Jul 10, 2026, 08:51 UTC
- Message-ID
- <20260710085137.4171240-1-christian.couder@gmail.com>
Since 7b70e9efb1 (upload-pack: disable lazy-fetching by default, 2024-04-16), lazy fetching has been controlled by the `GIT_NO_LAZY_FETCH` environment variable. This is currently an "all or nothing" boolean that is set to 'true' by default when calling `git upload-pack` for security reasons.
Recently the "promisor-remote" capability was added to protocol v2, allowing servers and clients to agree on the promisor remotes they can safely use.
This series leverages that capability to implement a pragmatic middle ground. By setting `GIT_NO_LAZY_FETCH` to 'fromAccepted', lazy fetching is allowed only when fetching from promisor remotes that are both advertised by the server and accepted by the client.
Note that using an environment variable for this is probably not the best from a usability perspective. An `upload-pack.allowLazyFetch` configuration variable would likely be better.
Unfortunately the `GIT_NO_LAZY_FETCH` environment variable is the way things currently work. It would be a much bigger and more invasive change to implement `upload-pack.allowLazyFetch` in a way that is compatible with `GIT_NO_LAZY_FETCH` which has to stay anyway for backward compatibility. Therefore, transitioning to a configuration variable is left for future work.
High level overview of the patches ==================================
Patch 1/3: A refactor which separates the fetching logic from the error handling and validation logic. This might also slightly increase performance if there are several promisor remotes.
Patch 2/3: A preparatory commit that transitions `GIT_NO_LAZY_FETCH` from a strict boolean check into an enum that can support multiple states.
Patch 3/3: Introduces the 'fromAccepted' option, taking advantage of the previous preparatory commits.
CI tests ========
They all pass, see:
https://github.com/chriscool/git/actions/runs/29078195030
Christian Couder (3): promisor-remote: factor out lazy_fetch_objects() promisor-remote: introduce enum allow_lazy_fetch promisor-remote: teach 'fromAccepted' to GIT_NO_LAZY_FETCH
Documentation/git-upload-pack.adoc | 5 ++ Documentation/git.adoc | 6 +- promisor-remote.c | 110 ++++++++++++++++++-------- promisor-remote.h | 14 ++++ setup.c | 5 +- t/t5710-promisor-remote-capability.sh | 49 ++++++++++++ 6 files changed, 154 insertions(+), 35 deletions(-)
-- 2.55.0.125.g395cd2c8ec.dirty