git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [topgit] tg update error

From
Jeff King <peff@peff.net>
Date
Feb 12, 2009, 12:56 UTC
Message-ID
<20090212125621.GB5397@sigill.intra.peff.net>
In-Reply-To
<20090212092558.GB21074@skywalker>
On Thu, Feb 12, 2009 at 02:55:58PM +0530, Aneesh Kumar K.V wrote:
Show 15 quoted lines
> On Thu, Feb 12, 2009 at 09:48:11AM +0100, martin f krafft wrote:
> > also sprach Aneesh Kumar <aneesh.kumar@gmail.com> [2009.02.12.0909 +0100]:
> > > doing a tg update with latest git gives the below error
> > >
> > > [extent_validate@linux-2.6]$ tg update
> > > fatal: Refusing to point HEAD outside of refs/heads/
> > > [extent_validate@linux-2.6]$
> >
> > Which version? And could you please provide (a lot) more information
> > about your repository or make it available?
> >
>
> Latest git and topgit. Moving to git version v1.6.1.3 fixed the issue.
> I can reproduce the problem on any test repo. Just do a tg update after
> committing something in the dependent branch.

This error message and safety valve are not in any released version of git yet. So by moving back to 1.6.1.3, you are just predating the addition of that message. :)

I think I know what is going on. A safety valve was added in afe5d3d to disallow setting HEAD to anything that would violate git's "is this a git directory" detector:

    symbolic ref: refuse non-ref targets in HEAD
    When calling "git symbolic-ref" it is easy to forget that
    the target must be a fully qualified ref. E.g., you might
    accidentally do:
      $ git symbolic-ref HEAD master
    Unfortunately, this is very difficult to recover from,
    because the bogus contents of HEAD make git believe we are
    no longer in a git repository (as is_git_dir explicitly
    checks for "^refs/heads/" in the HEAD target). So
    immediately trying to fix the situation doesn't work:
      $ git symbolic-ref HEAD refs/heads/master
      fatal: Not a git repository
    and one is left editing the .git/HEAD file manually.

Released versions of git just check "refs/" in HEAD. _But_ as part of this patch series, b229d18 also tightened the "refs/" check to "refs/heads/".

So what I suspect is happening is that topgit is trying to set HEAD to "refs/top-bases/whatever". Aneesh, can you confirm by running your test with GIT_TRACE=1? I suspect you will see a call like "git symbolic-ref HEAD refs/top-bases/foo".

Junio, I think we should probably revert b229d18 (and loosen symbolic-ref's check to just "refs/"). Even if you want to argue that topgit should be changed to handle this differently, we are still breaking existing topgit installations, and who knows what other scripts which might have relied on doing something like this.

-Peff
Previous: Bert WesargNext: Jeff King
Message 7 of 20 in “[topgit] tg update error”
  1. Aneesh KumarFeb 12, 2009
  2. martin f krafftFeb 12, 2009
  3. Aneesh Kumar K.VFeb 12, 2009
  4. martin f krafftFeb 12, 2009
  5. Aneesh Kumar K.VFeb 12, 2009
  6. Bert WesargFeb 12, 2009
  7. Jeff KingFeb 12, 2009
  8. Jeff KingFeb 12, 2009
  9. martin f krafftFeb 12, 2009
  10. Junio C HamanoFeb 12, 2009
  11. martin f krafftFeb 12, 2009
  12. Junio C HamanoFeb 12, 2009
  13. martin f krafftFeb 13, 2009
  14. Junio C HamanoFeb 13, 2009
  15. Junio C HamanoFeb 13, 2009
  16. Jeff KingFeb 13, 2009
  17. Junio C HamanoFeb 14, 2009
  18. Jeff KingFeb 14, 2009
  19. Junio C HamanoFeb 14, 2009
  20. Jeff KingFeb 14, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.