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

Re: Bug in "revision.c: --all adds HEAD from all worktrees" ?

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Mar 12, 2018, 21:39 UTC
Message-ID
<878taxq8gm.fsf@evledraar.gmail.com>
In-Reply-To
<CAE5ih79wG3ws=OyXqvbd+QKyyAmM-D2JVO5r9G5VHtoOfiXdug@mail.gmail.com>
On Thu, Nov 16 2017, Luke Diamand jotted:
Show 66 quoted lines
> On 15 November 2017 at 22:08, Junio C Hamano <gitster@pobox.com> wrote:
>> Luke Diamand <luke@diamand.org> writes:
>>
>>> Quite a few of the worktrees have expired - their head revision has
>>> been GC'd and no longer points to anything sensible
>>> (gc.worktreePruneExpire). The function other_head_refs() in worktree.c
>>> bails out if there's an error, which I think is the problem. I wonder
>>> if it should instead just report something and then keep going.
>>
>> Am I correct to understand that your "git fsck" would fail because
>> these HEAD refs used by other stale worktrees are pointing at
>> missing objects?
>
> git fsck says:
>
> Checking object directories: 100% (256/256), done.
> Checking objects: 100% (1434634/1434634), done.
> error: HEAD: invalid reflog entry
> 7fa2b7ee4bc0d11529f659db8b13ed1f537d2a98
> error: HEAD: invalid reflog entry
> 7fa2b7ee4bc0d11529f659db8b13ed1f537d2a98
> error: HEAD: invalid reflog entry
> 7e79e09e8a7382f91610f7255a1b99ea59f68c0b
> error: refs/stash: invalid reflog entry
> feeb35e7b045d28943c706e761d0a2ac8206af2f
> error: refs/remotes/origin/master: invalid reflog entry
> 7fa2b7ee4bc0d11529f659db8b13ed1f537d2a98
> Checking connectivity: 1419477, done.
> missing tree 1480c0a7ed2ad59ae701667292399c38d294658e
> missing tree ca2a01116bfbbd1fcbcf9812b95d8dc6c39e69d5
> missing tree 5b7c41e547fc5c4c840e5b496da13d3daebc5fbe
> ...
> ...
>
>>
>> What do you mean by "expired"?  "Even though I want to keep using
>> them, Git for some reason decided to destroy them." or "I no longer
>> use them but kept them lying around."?
>
> git worktree automatically prunes work trees:
>
> "The working tree’s administrative files in the repository (see
> "DETAILS" below) will eventually be removed automatically (see
> gc.worktreePruneExpire in git-config(1)),"
>
> In my case I didn't actually want them removed, but fortunately
> there's nothing important in them (there certainly isn't anymore...).
>
>>
>> If the latter, I wonder "worktree prune" to remove the
>> admininstrative information for them would unblock you?
>
> It doesn't seem to help.
>
> $ git worktree prune -n
> <lists lots of unhappy trees>
> $ git worktree prune
> $ git fetch
> remote: Counting objects: 35, done.
> remote: Compressing objects: 100% (20/20), done.
> remote: Total 21 (delta 17), reused 5 (delta 1)
> Unpacking objects: 100% (21/21), done.
> fatal: bad object HEAD
> error: ssh://whatever/myrepol did not send all necessary objects
> $ /usr/bin/git-2.7.3 fetch
> <works fine>

Digging up this old thread. I've also noticed this bug because I tried to "git repack -A -d" a repo on a GitLab server and just got "fatal: bad object HEAD".

Bisect revealed that the reason was that GitLab itself runs 2.14.3, which is the last release version that doesn't have Duy's d0c39a49cc ("revision.c: --all adds HEAD from all worktrees", 2017-08-23), and that the HEAD revision of some worktrees was corrupt (GitLab creates squash-* worktrees for some reason).

Doing a "git worktree prune" beforehand makes it work.
This can be reproduced with:
    (
        rm -rf /tmp/git &&
        git clone --bare https://github.com/git/git.git /tmp/git &&
        cd /tmp/git &&
        git worktree add blah HEAD &&
        echo 1111111111111111111111111111111111111111 > worktrees/blah/HEAD
    )

Now, obviously the root cause is that the repo is corrupt through some other bug (since fixed?), but the error message here is really bad, and should at least say "fatal: bad object HEAD in worktree blah" or something like that.

Previous: Luke DiamandNext: Duy Nguyen
Message 8 of 9 in “Bug in "revision.c: --all adds HEAD from all worktrees" ?”
  1. Luke DiamandNov 13, 2017
  2. Luke DiamandNov 13, 2017
  3. Stefan BellerNov 13, 2017
  4. Luke DiamandNov 15, 2017
  5. Jeff KingNov 17, 2017
  6. Junio C HamanoNov 15, 2017
  7. Luke DiamandNov 16, 2017
  8. Ævar Arnfjörð BjarmasonMar 12, 2018
  9. Duy NguyenMar 13, 2018

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.