Skip to content

Commit

Permalink
Fix fetch/pull when run without --update-head-ok
Browse files Browse the repository at this point in the history
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 <johannes.schindelin@gmx.de>
Acked-by: Shawn O. Pearce <spearce@spearce.org>
Acked-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Johannes Schindelin authored and Junio C Hamano committed Oct 13, 2008
1 parent 97a7a82 commit 8ee5d73
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 3 deletions.
15 changes: 15 additions & 0 deletions builtin-fetch.c
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,19 @@ static void find_non_local_tags(struct transport *transport,
string_list_clear(&new_refs, 0);
}

static void check_not_current_branch(struct ref *ref_map)
{
struct branch *current_branch = branch_get(NULL);

if (is_bare_repository() || !current_branch)
return;

for (; ref_map; ref_map = ref_map->next)
if (ref_map->peer_ref && !strcmp(current_branch->refname,
ref_map->peer_ref->name))
die("Refusing to fetch into current branch");
}

static int do_fetch(struct transport *transport,
struct refspec *refs, int ref_count)
{
Expand All @@ -558,6 +571,8 @@ static int do_fetch(struct transport *transport,
}

ref_map = get_ref_map(transport, refs, ref_count, tags, &autotags);
if (!update_head_ok)
check_not_current_branch(ref_map);

for (rm = ref_map; rm; rm = rm->next) {
if (rm->peer_ref)
Expand Down
2 changes: 1 addition & 1 deletion t/t5405-send-pack-rewind.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ test_expect_success setup '
mkdir another && (
cd another &&
git init &&
git fetch .. master:master
git fetch --update-head-ok .. master:master
) &&
>file2 && git add file2 && test_tick &&
Expand Down
2 changes: 1 addition & 1 deletion t/t5505-remote.sh
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ test_expect_success 'prune --dry-run' '
test_expect_success 'add --mirror && prune' '
(mkdir mirror &&
cd mirror &&
git init &&
git init --bare &&
git remote add --mirror -f origin ../one) &&
(cd one &&
git branch -m side2 side) &&
Expand Down
12 changes: 12 additions & 0 deletions t/t5510-fetch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -303,4 +303,16 @@ test_expect_success 'pushing nonexistent branch by mistake should not segv' '
'

test_expect_success 'refuse to fetch into the current branch' '
test_must_fail git fetch . side:master
'

test_expect_success 'fetch into the current branch with --update-head-ok' '
git fetch --update-head-ok . side:master
'

test_done
2 changes: 1 addition & 1 deletion t/t9300-fast-import.sh
Original file line number Diff line number Diff line change
Expand Up @@ -983,7 +983,7 @@ test_expect_success \
git checkout subuse1 &&
rm -rf sub && mkdir sub && cd sub &&
git init &&
git fetch .. refs/heads/sub:refs/heads/master &&
git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
git checkout master &&
cd .. &&
git submodule init &&
Expand Down

0 comments on commit 8ee5d73

Please sign in to comment.