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 <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>maint
parent
97a7a82f19
commit
8ee5d73137
|
@ -534,6 +534,19 @@ static void find_non_local_tags(struct transport *transport,
|
||||||
string_list_clear(&new_refs, 0);
|
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,
|
static int do_fetch(struct transport *transport,
|
||||||
struct refspec *refs, int ref_count)
|
struct refspec *refs, int ref_count)
|
||||||
{
|
{
|
||||||
|
@ -558,6 +571,8 @@ static int do_fetch(struct transport *transport,
|
||||||
}
|
}
|
||||||
|
|
||||||
ref_map = get_ref_map(transport, refs, ref_count, tags, &autotags);
|
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) {
|
for (rm = ref_map; rm; rm = rm->next) {
|
||||||
if (rm->peer_ref)
|
if (rm->peer_ref)
|
||||||
|
|
|
@ -12,7 +12,7 @@ test_expect_success setup '
|
||||||
mkdir another && (
|
mkdir another && (
|
||||||
cd another &&
|
cd another &&
|
||||||
git init &&
|
git init &&
|
||||||
git fetch .. master:master
|
git fetch --update-head-ok .. master:master
|
||||||
) &&
|
) &&
|
||||||
|
|
||||||
>file2 && git add file2 && test_tick &&
|
>file2 && git add file2 && test_tick &&
|
||||||
|
|
|
@ -188,7 +188,7 @@ test_expect_success 'prune --dry-run' '
|
||||||
test_expect_success 'add --mirror && prune' '
|
test_expect_success 'add --mirror && prune' '
|
||||||
(mkdir mirror &&
|
(mkdir mirror &&
|
||||||
cd mirror &&
|
cd mirror &&
|
||||||
git init &&
|
git init --bare &&
|
||||||
git remote add --mirror -f origin ../one) &&
|
git remote add --mirror -f origin ../one) &&
|
||||||
(cd one &&
|
(cd one &&
|
||||||
git branch -m side2 side) &&
|
git branch -m side2 side) &&
|
||||||
|
|
|
@ -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
|
test_done
|
||||||
|
|
|
@ -983,7 +983,7 @@ test_expect_success \
|
||||||
git checkout subuse1 &&
|
git checkout subuse1 &&
|
||||||
rm -rf sub && mkdir sub && cd sub &&
|
rm -rf sub && mkdir sub && cd sub &&
|
||||||
git init &&
|
git init &&
|
||||||
git fetch .. refs/heads/sub:refs/heads/master &&
|
git fetch --update-head-ok .. refs/heads/sub:refs/heads/master &&
|
||||||
git checkout master &&
|
git checkout master &&
|
||||||
cd .. &&
|
cd .. &&
|
||||||
git submodule init &&
|
git submodule init &&
|
||||||
|
|
Loading…
Reference in New Issue