Some confusing tutorials suggest that it would be a good idea to call something like this: git pull origin master:master While it might make sense to store what you want to merge, it typically is plain wrong. Especially so when the current branch is "master". Be at least a little bit helpful by refusing to fetch something into the current branch. Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- builtin-fetch.c | 20 ++++++++++++++++++++ t/t5505-remote.sh | 2 +- t/t5510-fetch.sh | 6 ++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/builtin-fetch.c b/builtin-fetch.c index ee93d3a..d701550 100644 --- a/builtin-fetch.c +++ b/builtin-fetch.c @@ -534,6 +534,25 @@ static void find_non_local_tags(struct transport *transport, string_list_clear(&new_refs, 0); } +static void check_ref_map(struct ref *ref_map) +{ + int flag; + unsigned char sha1[20]; + const char *HEAD; + + if (is_bare_repository()) + return; + + HEAD = resolve_ref("HEAD", sha1, 1, &flag); + + if (!HEAD || !(flag & REF_ISSYMREF)) + return; + + for (; ref_map; ref_map = ref_map->next) + if (ref_map->peer_ref && !strcmp(HEAD, 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) { @@ -558,6 +577,7 @@ static int do_fetch(struct transport *transport, } ref_map = get_ref_map(transport, refs, ref_count, tags, &autotags); + check_ref_map(ref_map); for (rm = ref_map; rm; rm = rm->next) { if (rm->peer_ref) diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh index c449663..0103e1a 100755 --- a/t/t5505-remote.sh +++ b/t/t5505-remote.sh @@ -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) && diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index 9aae496..cd8b550 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -323,4 +323,10 @@ test_expect_success 'auto tag following fetches minimum' ' ) ' +test_expect_success 'refuse to fetch into the current branch' ' + + test_must_fail git fetch . side:master + +' + test_done -- 1.6.0.2.749.g0cc32 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html