These patches are based on jc/no-update-fetch-head. After the email exchange with Junio, I went back and took a look to see if I could accomplish what I needed without using NULL methods in the fetch negotiators. And I could do it - I just had to be more careful when iterating over refs and dereferencing them. You can see it in patch 5. In version 1, I wrote that these needed to be done: - Commit messages - User-facing documentation - A way to prevent a promisor-remote fetch from invoking another promisor-remote fetch (use a file as a lock?) - Remove no_dependents code (fetch-pack, transport) 1, 2, and 4 are already done. As for 3, we currently don't have this safeguard before this patch set, so I did not include one in this patch set either. Jonathan Tan (7): negotiator/null: add null fetch negotiator fetch: allow refspecs specified through stdin fetch: avoid reading submodule config until needed fetch: only populate existing_refs if needed fetch-pack: do not lazy-fetch during ref iteration promisor-remote: lazy-fetch objects in subprocess fetch-pack: remove no_dependents code Documentation/config/fetch.txt | 5 +- Documentation/git-fetch.txt | 4 + Documentation/technical/partial-clone.txt | 13 +- Makefile | 1 + builtin/fetch-pack.c | 4 - builtin/fetch.c | 42 ++++- fetch-negotiator.c | 5 + fetch-pack.c | 189 +++++++++------------- fetch-pack.h | 14 -- negotiator/null.c | 44 +++++ negotiator/null.h | 8 + promisor-remote.c | 46 +++--- remote-curl.c | 6 - repo-settings.c | 2 + repository.h | 1 + submodule-config.c | 5 +- t/t0410-partial-clone.sh | 2 +- t/t4067-diff-partial-clone.sh | 8 +- t/t5554-null-fetch-negotiator.sh | 22 +++ t/t5601-clone.sh | 2 +- t/t5616-partial-clone.sh | 20 +++ transport.c | 4 - transport.h | 7 - 23 files changed, 252 insertions(+), 202 deletions(-) create mode 100644 negotiator/null.c create mode 100644 negotiator/null.h create mode 100755 t/t5554-null-fetch-negotiator.sh -- 2.28.0.236.gb10cc79966-goog