On Thu, Dec 10, 2020 at 7:55 AM Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> wrote: > [...] > Let's help the user in this case by doing a very loose check for > whether the ref name looks like a pseudoref such as "HEAD" (i.e. only > has upper case, dashes, underbars), and if not issue a warning: > [...] > Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> > --- > diff --git a/Documentation/config/core.txt b/Documentation/config/core.txt > @@ -355,6 +355,17 @@ core.warnAmbiguousRefs:: > +core.warnNonPseudoRefs:: > + If true, Git will warn you if the `<ref>` you passed > + unexpectedly resolves to a top-level ref stored in > + `.git/<file>` but doesn't look like a pseudoref such as > + `HEAD`, `MERGE_HEAD` etc. True by default. > ++ > +These references are ignored by linkgit:for-each-ref[1], but resolved > +by linkgit:git-show[1], linkgit:git-rev-parse[1] etc. So it can be > +confusing to have e.g. an errant `.git/master` being confused with > +`.git/refs/heads/master`. Dscho has been submitting patches lately to eradicate the word "master" from the project source. > diff --git a/refs.c b/refs.c > @@ -669,6 +676,19 @@ int expand_ref(struct repository *repo, const char *str, int len, > if (r) { > + if (warn_non_pseudo_refs && > + !starts_with(fullref.buf, "refs/") && > + !starts_with(r, "refs/") && > + !strchr(r, '/') && > + !is_any_pseudoref_syntax(r) && > + !warned_on_non_pseudo_ref++) { > + /* > + * TRANSLATORS: The 1st argument is > + * e.g. "master", and the 2nd can be > + * e.g. "master~10". > + */ > + warning(_("matched ref name .git/%s doesn't look like a pseudoref"), r); The TRANSLATORS comment talks about two arguments, but I see only one. Does the "matched ref name" part add any value? I would find the warning just as helpful without it: .git/blork doesn't look like a pseudoref > diff --git a/t/t1430-bad-ref-name.sh b/t/t1430-bad-ref-name.sh > @@ -374,4 +374,45 @@ test_expect_success 'branch -m can rename refs/heads/-dash' ' > +test_expect_success 'warn on non-pseudoref syntax refs in .git/' ' > + test_when_finished " > + rm -f .git/mybranch && > + rm -rf .git/a-dir && > + rm -rf .git/MY-BRANCH_NAME && > + rm -rf .git/MY-branch_NAME > + " && Nit: These could all be removed with a single `rm -rf`: rm -rf .git/mybranch .git/a-dir ... > + # We do not ignore lower-case > + cp expect .git/mybranch && > + git rev-parse mybranch >hash 2>err && > + test_cmp expect hash && > + GIT_TEST_GETTEXT_POISON=false grep "like a pseudoref" err && What is the purpose of assigning GIT_TEST_GETTEXT_POISON here? > + git -c core.warnNonPseudoRefs=false rev-parse mybranch >hash 2>err && > + test_cmp expect hash && > + test_must_be_empty err && > + rm .git/mybranch > +'