fetch: support hideRefs to speed up connectivity checks

With roughly 800 remotes all fetching into their own
refs/remotes/$REMOTE/* island, the connectivity check[1] gets
expensive for each fetch on systems which lack sufficient RAM to
cache objects.

To do a no-op fetch on one $REMOTE out of hundreds, hideRefs now
allows the no-op fetch to take ~30 seconds instead of ~20 minutes
on a noisy, RAM-constrained machine (localhost, so no network latency):

   git -c fetch.hideRefs=refs \
	-c fetch.hideRefs='!refs/remotes/$REMOTE/' \
	fetch $REMOTE

[1] `git rev-list --objects --stdin --not --all --quiet --alternate-refs'

Signed-off-by: Eric Wong <e@80x24.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Eric Wong
2023-02-12 09:04:26 +00:00
committed by Junio C Hamano
parent dadc8e6dac
commit c6ce27ab08
8 changed files with 26 additions and 12 deletions

View File

@ -1171,6 +1171,15 @@ test_expect_success '--no-show-forced-updates' '
)
'
for section in fetch transfer
do
test_expect_success "$section.hideRefs affects connectivity check" '
GIT_TRACE="$PWD"/trace git -c $section.hideRefs=refs -c \
$section.hideRefs="!refs/tags/" fetch &&
grep "git rev-list .*--exclude-hidden=fetch" trace
'
done
setup_negotiation_tip () {
SERVER="$1"
URL="$2"