Skip to content

Commit 4784443

Browse files
committed
Merge branch 'jc/set-head-symref-fix' into next
"git fetch" from a configured remote learned to update a missing remote-tracking HEAD but it asked the remote about their HEAD even when it did not need to, which has been corrected. Incidentally, this also corrects "git fetch --tags $URL" which was broken by the new feature in an unspecified way. * jc/set-head-symref-fix: fetch: do not ask for HEAD unnecessarily
2 parents f74b3f2 + 6c915c3 commit 4784443

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

builtin/fetch.c

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1688,6 +1688,21 @@ static int set_head(const struct ref *remote_refs, int follow_remote_head,
16881688
return result;
16891689
}
16901690

1691+
static int uses_remote_tracking(struct transport *transport, struct refspec *rs)
1692+
{
1693+
if (!remote_is_configured(transport->remote, 0))
1694+
return 0;
1695+
1696+
if (!rs->nr)
1697+
rs = &transport->remote->fetch;
1698+
1699+
for (int i = 0; i < rs->nr; i++)
1700+
if (rs->items[i].dst)
1701+
return 1;
1702+
1703+
return 0;
1704+
}
1705+
16911706
static int do_fetch(struct transport *transport,
16921707
struct refspec *rs,
16931708
const struct fetch_config *config)
@@ -1757,7 +1772,10 @@ static int do_fetch(struct transport *transport,
17571772
"refs/tags/");
17581773
}
17591774

1760-
strvec_push(&transport_ls_refs_options.ref_prefixes, "HEAD");
1775+
if (uses_remote_tracking(transport, rs)) {
1776+
must_list_refs = 1;
1777+
strvec_push(&transport_ls_refs_options.ref_prefixes, "HEAD");
1778+
}
17611779

17621780
if (must_list_refs) {
17631781
trace2_region_enter("fetch", "remote_refs", the_repository);

t/t5510-fetch.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,23 @@ test_expect_success 'fetch --prune --tags with refspec prunes based on refspec'
326326
git rev-parse sometag
327327
'
328328

329+
test_expect_success 'fetch --tags gets tags even without a configured remote' '
330+
REMOTE="$(pwd)/test_tag_1" &&
331+
git init test_tag_1 &&
332+
(
333+
cd test_tag_1 &&
334+
test_commit foo
335+
) &&
336+
git init test_tag_2 &&
337+
(
338+
cd test_tag_2 &&
339+
git fetch --tags "file://$REMOTE" &&
340+
echo "foo" >expect &&
341+
git tag >actual &&
342+
test_cmp expect actual
343+
)
344+
'
345+
329346
test_expect_success REFFILES 'fetch --prune fails to delete branches' '
330347
cd "$D" &&
331348
git clone . prune-fail &&

0 commit comments

Comments
 (0)