]> git.ipfire.org Git - thirdparty/git.git/commitdiff
remote: use the configured default branch name when appropriate
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Wed, 24 Jun 2020 14:46:35 +0000 (14:46 +0000)
committerJunio C Hamano <gitster@pobox.com>
Wed, 24 Jun 2020 16:14:21 +0000 (09:14 -0700)
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 initial
branch of new repositories (because as far as the user is concerned, a
remote that has no branches yet is a new repository).

At the same time, when talking to an older Git server that does not
report a symref for `HEAD` (but instead reports a commit hash), let's
try to guess the configured default branch name first. If it does not
match the reported commit hash, let's fall back to `master` as before.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
remote.c
t/t5606-clone-options.sh

index 534c6426f1e653e6fbb81bd7256a6b3f9d2dfb19..bc46413e6a75788da66b5c0c6bec9aa5a52c5403 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -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 default (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 = (char *)git_default_branch_name();
 
        add_url_alias(remote, strbuf_detach(&buf, NULL));
        strbuf_addf(&buf, "refs/heads/%s:refs/heads/%s",
@@ -2097,8 +2097,16 @@ 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 default branch name, let's use it. */
        if (!all) {
+               char *ref = xstrfmt("refs/heads/%s", git_default_branch_name());
+
+               r = find_ref_by_name(refs, ref);
+               free(ref);
+               if (r && oideq(&r->old_oid, &head->old_oid))
+                       return copy_ref(r);
+
+               /* Fall back to the hard-coded historical default */
                r = find_ref_by_name(refs, "refs/heads/master");
                if (r && oideq(&r->old_oid, &head->old_oid))
                        return copy_ref(r);
index 286bfd93ac2fa218b7f81320ef0dfeef3a0b3c08..e69427f8817a6e2170ce1175991e8badb0e78ecb 100755 (executable)
@@ -47,7 +47,16 @@ test_expect_success 'guesses initial branch name correctly' '
        test_commit -C initial-branch no-spoilers &&
        git -C initial-branch branch abc guess &&
        git clone initial-branch is-it &&
-       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 initial-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