Skip to content

Commit ae75cef

Browse files
committed
Merge branch 'jc/set-head-symref-fix'
"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 5f21268 + 6c915c3 commit ae75cef

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
@@ -1640,6 +1640,21 @@ static int set_head(const struct ref *remote_refs)
16401640
return result;
16411641
}
16421642

1643+
static int uses_remote_tracking(struct transport *transport, struct refspec *rs)
1644+
{
1645+
if (!remote_is_configured(transport->remote, 0))
1646+
return 0;
1647+
1648+
if (!rs->nr)
1649+
rs = &transport->remote->fetch;
1650+
1651+
for (int i = 0; i < rs->nr; i++)
1652+
if (rs->items[i].dst)
1653+
return 1;
1654+
1655+
return 0;
1656+
}
1657+
16431658
static int do_fetch(struct transport *transport,
16441659
struct refspec *rs,
16451660
const struct fetch_config *config)
@@ -1709,7 +1724,10 @@ static int do_fetch(struct transport *transport,
17091724
"refs/tags/");
17101725
}
17111726

1712-
strvec_push(&transport_ls_refs_options.ref_prefixes, "HEAD");
1727+
if (uses_remote_tracking(transport, rs)) {
1728+
must_list_refs = 1;
1729+
strvec_push(&transport_ls_refs_options.ref_prefixes, "HEAD");
1730+
}
17131731

17141732
if (must_list_refs) {
17151733
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
@@ -188,6 +188,23 @@ test_expect_success 'fetch --prune --tags with refspec prunes based on refspec'
188188
git rev-parse sometag
189189
'
190190

191+
test_expect_success 'fetch --tags gets tags even without a configured remote' '
192+
REMOTE="$(pwd)/test_tag_1" &&
193+
git init test_tag_1 &&
194+
(
195+
cd test_tag_1 &&
196+
test_commit foo
197+
) &&
198+
git init test_tag_2 &&
199+
(
200+
cd test_tag_2 &&
201+
git fetch --tags "file://$REMOTE" &&
202+
echo "foo" >expect &&
203+
git tag >actual &&
204+
test_cmp expect actual
205+
)
206+
'
207+
191208
test_expect_success REFFILES 'fetch --prune fails to delete branches' '
192209
cd "$D" &&
193210
git clone . prune-fail &&

0 commit comments

Comments
 (0)