Skip to content

Commit 8ee5d73

Browse files
dschogitster
authored andcommitted
Fix fetch/pull when run without --update-head-ok
Some confusing tutorials suggested that it would be a good idea to fetch into the current branch with something like this: git fetch origin master:master (or even worse: the same command line with "pull" instead of "fetch"). While it might make sense to store what you want to pull, it typically is plain wrong when the current branch is "master". This should only be allowed when (an incorrect) "git pull origin master:master" tries to work around by giving --update-head-ok to underlying "git fetch", and otherwise we should refuse it, but somewhere along the lines we lost that behavior. The check for the current branch is now _only_ performed in non-bare repositories, which is an improvement from the original behaviour. Some newer tests were depending on the broken behaviour of "git fetch" this patch fixes, and have been adjusted. Signed-off-by: Johannes Schindelin <[email protected]> Acked-by: Shawn O. Pearce <[email protected]> Acked-by: Daniel Barkalow <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 97a7a82 commit 8ee5d73

File tree

5 files changed

+30
-3
lines changed

5 files changed

+30
-3
lines changed

builtin-fetch.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,19 @@ static void find_non_local_tags(struct transport *transport,
534534
string_list_clear(&new_refs, 0);
535535
}
536536

537+
static void check_not_current_branch(struct ref *ref_map)
538+
{
539+
struct branch *current_branch = branch_get(NULL);
540+
541+
if (is_bare_repository() || !current_branch)
542+
return;
543+
544+
for (; ref_map; ref_map = ref_map->next)
545+
if (ref_map->peer_ref && !strcmp(current_branch->refname,
546+
ref_map->peer_ref->name))
547+
die("Refusing to fetch into current branch");
548+
}
549+
537550
static int do_fetch(struct transport *transport,
538551
struct refspec *refs, int ref_count)
539552
{
@@ -558,6 +571,8 @@ static int do_fetch(struct transport *transport,
558571
}
559572

560573
ref_map = get_ref_map(transport, refs, ref_count, tags, &autotags);
574+
if (!update_head_ok)
575+
check_not_current_branch(ref_map);
561576

562577
for (rm = ref_map; rm; rm = rm->next) {
563578
if (rm->peer_ref)

t/t5405-send-pack-rewind.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ test_expect_success setup '
1212
mkdir another && (
1313
cd another &&
1414
git init &&
15-
git fetch .. master:master
15+
git fetch --update-head-ok .. master:master
1616
) &&
1717
1818
>file2 && git add file2 && test_tick &&

t/t5505-remote.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ test_expect_success 'prune --dry-run' '
188188
test_expect_success 'add --mirror && prune' '
189189
(mkdir mirror &&
190190
cd mirror &&
191-
git init &&
191+
git init --bare &&
192192
git remote add --mirror -f origin ../one) &&
193193
(cd one &&
194194
git branch -m side2 side) &&

t/t5510-fetch.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,4 +303,16 @@ test_expect_success 'pushing nonexistent branch by mistake should not segv' '
303303
304304
'
305305

306+
test_expect_success 'refuse to fetch into the current branch' '
307+
308+
test_must_fail git fetch . side:master
309+
310+
'
311+
312+
test_expect_success 'fetch into the current branch with --update-head-ok' '
313+
314+
git fetch --update-head-ok . side:master
315+
316+
'
317+
306318
test_done

t/t9300-fast-import.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,7 @@ test_expect_success \
983983
git checkout subuse1 &&
984984
rm -rf sub && mkdir sub && cd sub &&
985985
git init &&
986-
git fetch .. refs/heads/sub:refs/heads/master &&
986+
git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
987987
git checkout master &&
988988
cd .. &&
989989
git submodule init &&

0 commit comments

Comments
 (0)