Re: [BUG?] HEAD detached at HEAD
- From
Matthieu Moy <matthieu.moy@grenoble-inp.fr>
- Date
- Sep 18, 2015, 19:09 UTC
- Message-ID
- <vpqlhc3h7e7.fsf@anie.imag.fr>
- In-Reply-To
- <CAGZ79kZxAwMvv6UoZLBd2wTOdj1DFWKQqSPBYL449KSokA8DQQ@mail.gmail.com>
Stefan Beller <sbeller@google.com> writes:
Show 17 quoted lines
> On Fri, Sep 18, 2015 at 10:23 AM, Matthieu Moy > <Matthieu.Moy@grenoble-inp.fr> wrote: >> Jacob Keller <jacob.keller@gmail.com> writes: >> >>> On Fri, Sep 18, 2015 at 9:59 AM, Matthieu Moy >>> <Matthieu.Moy@grenoble-inp.fr> wrote: >>>> I'm getting it even if there's a tag and/or a branch pointing to the >>>> same commit. >>>> >>>> Any idea what's going on? >>> >>> Any chance you accidentally made a branch or tag named HEAD? >> >> Nice try ;-), but no: > > I was playing around with origin/master and origin/pu and > I cannot reproduce this bug.
I investigated a bit more. The root of the problem is "git checkout --detach" and the reflog. Here's a reproduction script:
rm -fr test-repo git init test-repo cd test-repo echo foo>bar; git add bar; git commit -m "foo" echo boz>bar; git add bar; git commit -m "boz" git checkout --detach git status git branch rm -fr .git/logs/ git status git branch
The end of the output is:
+ git checkout --detach
+ git status
HEAD detached at HEAD
nothing to commit, working directory clean
+ git branch
* (HEAD detached at HEAD)
master
+ rm -fr .git/logs/
+ git status
Not currently on any branch.
nothing to commit, working directory clean
+ git branch
* (no branch)
masterIf one replaces "git checkout --detach" with "git checkout HEAD^0", then the output is the one I expected:
HEAD detached at cb39b20
The guilty line in the reflog is:
checkout: moving from master to HEAD
One possible fix is to resolve HEAD when encountering it in the reflog, like this:
--- a/wt-status.c +++ b/wt-status.c @@ -1319,6 +1319,13 @@ static int grab_1st_switch(unsigned char *osha1, unsigned char *nsha1, hashcpy(cb->nsha1, nsha1); for (end = target; *end && *end != '\n'; end++) ; + if (!memcmp(target, "HEAD", end - target)) { + /* Don't say "HEAD detached at HEAD" */ + unsigned char head[GIT_SHA1_RAWSZ]; + get_sha1("HEAD", head); + strbuf_addstr(&cb->buf, find_unique_abbrev(head, DEFAULT_ABBREV)); + return 1; + } strbuf_add(&cb->buf, target, end - target); return 1; } What do you think? Shall I turn this into a proper patch? Thanks,
-- Matthieu Moy http://www-verimag.imag.fr/~moy/