Skip to content

Commit 3ee1757

Browse files
drafnelgitster
authored andcommitted
builtin/fetch.c: ignore merge config when not fetching from branch's remote
When 'git fetch' is supplied a single argument, it tries to match it against a configured remote and then fetch the refs specified by the named remote's fetchspec. Additionally, or alternatively, if the current branch has a merge ref configured, and if the name of the remote supplied to fetch matches the one in the branch's configuration, then git also adds the merge ref to the list of refs to update. If the argument to fetch does not specify a named remote, or if the name supplied does not match the remote configured for the current branch, then the current branch's merge configuration should not be considered. git currently mishandles the case when the argument to fetch specifies a GIT URL(i.e. not a named remote) and the current branch has a configured merge ref. In this case, fetch should ignore the branch's merge ref and attempt to fetch from the remote repository's HEAD branch. But, since fetch only checks _whether_ the current branch has a merge ref configured, and does _not_ check whether the branch's configured remote matches the command line argument (until later), it will mistakenly enter the wrong branch of an 'if' statement and will not fall back to fetch the HEAD branch. The fetch ends up doing nothing and returns with a successful zero status. Fix this by comparing the remote repository's name to the branch's remote name, in addition to whether it has a configured merge ref, sooner, so that fetch can correctly decide whether the branch's configuration is interesting or not, and fall back to fetching from the remote's HEAD branch when appropriate. This fixes the test in t5510. Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 6106ce4 commit 3ee1757

2 files changed

Lines changed: 4 additions & 2 deletions

File tree

builtin/fetch.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,9 @@ static struct ref *get_ref_map(struct transport *transport,
146146
struct remote *remote = transport->remote;
147147
struct branch *branch = branch_get(NULL);
148148
int has_merge = branch_has_merge_config(branch);
149-
if (remote && (remote->fetch_refspec_nr || has_merge)) {
149+
if (remote &&
150+
(remote->fetch_refspec_nr ||
151+
(has_merge && !strcmp(branch->remote_name, remote->name)))) {
150152
for (i = 0; i < remote->fetch_refspec_nr; i++) {
151153
get_fetch_map(remote_refs, &remote->fetch[i], &tail, 0);
152154
if (remote->fetch[i].dst &&

t/t5510-fetch.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ test_expect_success 'fetch with a non-applying branch.<name>.merge' '
240240
git fetch blub
241241
'
242242

243-
test_expect_failure 'fetch from GIT URL with a non-applying branch.<name>.merge' '
243+
test_expect_success 'fetch from GIT URL with a non-applying branch.<name>.merge' '
244244
git update-ref -d FETCH_HEAD &&
245245
git fetch one &&
246246
git rev-parse --verify FETCH_HEAD

0 commit comments

Comments
 (0)