On Thu, Nov 16 2017, Luke Diamand jotted: > On 15 November 2017 at 22:08, Junio C Hamano <gitster@xxxxxxxxx> wrote: >> Luke Diamand <luke@xxxxxxxxxxx> 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.