On Mon, Apr 05, 2021 at 04:49:29PM -0400, Derrick Stolee wrote: > On 4/5/2021 4:47 PM, Junio C Hamano wrote: > > Tom Saeger <tom.saeger@xxxxxxxxxx> writes: > > > >> $ git config --local --get-regexp "pr-924" > >> remote.pr-924.url https://github.com/gitgitgadget/git > >> remote.pr-924.fetch +refs/tags/pr-924/derrickstolee/maintenance/refspec-v1 > >> > >> Seems legal, fetch even works > > > > Yes. For a ref that is one-shot use (like PR tags), this does not > > make much sense, but > > > > [remote "submaintainer1"] > > url = ... repository of submaintainer #1 ... > > fetch = master > > tagopts = --no-tags > > > > is a reasonable thing to have for those who regularly work with > > submaintainer(s) of their project. They'd do > > > > $ git pull submaintainer1 > > > > to accept the work their submaintainers have done. > > Thanks for the extra testing! I'll be sure to fix this bug in v2. > > -Stolee > Hacked this: diff --git a/builtin/gc.c b/builtin/gc.c index 92cb8b4e0bfa..8c0fcbd3bb7e 100644 --- a/builtin/gc.c +++ b/builtin/gc.c @@ -879,6 +879,7 @@ static int fetch_remote(struct remote *remote, void *cbdata) struct maintenance_run_opts *opts = cbdata; struct child_process child = CHILD_PROCESS_INIT; int i; + int nargs; child.git_cmd = 1; strvec_pushl(&child.args, "fetch", remote->name, "--prune", "--no-tags", @@ -888,6 +889,8 @@ static int fetch_remote(struct remote *remote, void *cbdata) if (opts->quiet) strvec_push(&child.args, "--quiet"); + nargs = child.args.nr; + for (i = 0; i < remote->fetch.nr; i++) { struct refspec_item replace; struct refspec_item *rsi = &remote->fetch.items[i]; @@ -899,6 +902,10 @@ static int fetch_remote(struct remote *remote, void *cbdata) continue; } + if (!rsi->dst) { + continue; + } + refspec_item_init(&replace, remote->fetch.raw[i], 1); /* @@ -920,6 +927,10 @@ static int fetch_remote(struct remote *remote, void *cbdata) refspec_item_clear(&replace); } + /* skip remote if no refspecs to fetch */ + if (child.args.nr <= nargs) + return 0; + return !!run_command(&child); }