From: Johannes Schindelin <johannes.schindelin@xxxxxx> When guessing the default branch name of a remote, and there are no refs to guess from, we want to go with the preference specified by the user for the fall-back, i.e. the default name to be used for the main branch of new repositories (because as far as the user is concerned, a remote that has no branches yet is a new repository). Signed-off-by: Johannes Schindelin <johannes.schindelin@xxxxxx> --- remote.c | 15 ++++++++++----- t/t5606-clone-options.sh | 11 ++++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/remote.c b/remote.c index 534c6426f1e..2dcf4ac6d15 100644 --- a/remote.c +++ b/remote.c @@ -256,7 +256,7 @@ static void read_remotes_file(struct remote *remote) static void read_branches_file(struct remote *remote) { - char *frag; + char *frag, *main_branch = NULL; struct strbuf buf = STRBUF_INIT; FILE *f = fopen_or_warn(git_path("branches/%s", remote->name), "r"); @@ -276,7 +276,7 @@ static void read_branches_file(struct remote *remote) /* * The branches file would have URL and optionally - * #branch specified. The "master" (or specified) branch is + * #branch specified. The main (or specified) branch is * fetched and stored in the local branch matching the * remote name. */ @@ -284,7 +284,7 @@ static void read_branches_file(struct remote *remote) if (frag) *(frag++) = '\0'; else - frag = "master"; + frag = main_branch = git_main_branch_name(MAIN_BRANCH_FOR_INIT); add_url_alias(remote, strbuf_detach(&buf, NULL)); strbuf_addf(&buf, "refs/heads/%s:refs/heads/%s", @@ -299,6 +299,7 @@ static void read_branches_file(struct remote *remote) strbuf_addf(&buf, "HEAD:refs/heads/%s", frag); refspec_append(&remote->push, buf.buf); remote->fetch_tags = 1; /* always auto-follow */ + free(main_branch); strbuf_release(&buf); } @@ -2097,9 +2098,13 @@ struct ref *guess_remote_head(const struct ref *head, if (head->symref) return copy_ref(find_ref_by_name(refs, head->symref)); - /* If refs/heads/master could be right, it is. */ + /* If a remote branch exists with the main branch name, let's use it. */ if (!all) { - r = find_ref_by_name(refs, "refs/heads/master"); + char *name = git_main_branch_name(MAIN_BRANCH_FULL_NAME | + MAIN_BRANCH_FOR_INIT); + + r = find_ref_by_name(refs, name); + free(name); if (r && oideq(&r->old_oid, &head->old_oid)) return copy_ref(r); } diff --git a/t/t5606-clone-options.sh b/t/t5606-clone-options.sh index 98b2d8527f6..61ce9c09920 100755 --- a/t/t5606-clone-options.sh +++ b/t/t5606-clone-options.sh @@ -49,7 +49,16 @@ test_expect_success 'guesses main branch name correctly' ' git -C main-branch branch abc guess && git clone main-branch is-it && test guess = $(git -C is-it config core.mainBranch) && - test refs/heads/guess = $(git -C is-it symbolic-ref HEAD) + test refs/heads/guess = $(git -C is-it symbolic-ref HEAD) && + + git -c init.defaultBranch=none init --bare no-head && + git -C main-branch push ../no-head guess abc && + git clone no-head is-it2 && + test_must_fail git -C is-it2 symbolic-ref refs/remotes/origin/HEAD && + git -C no-head update-ref --no-deref HEAD refs/heads/guess && + git -c init.defaultBranch=guess clone no-head is-it3 && + test refs/remotes/origin/guess = \ + $(git -C is-it3 symbolic-ref refs/remotes/origin/HEAD) ' test_done -- gitgitgadget