I feel like a kid in the principal's office explaining that the dog ate my homework the night before it was due, but I'm staring some crazy data loss bug in the face and I can't figure out how it happened. I would like to know how git could eat my repository whole! I've put git through the wringer many times and it's never blinked. I've used it to split a 20 Gig Subversion repo into 27 git repos and filter-branched the foo out of them to untangle the mess and it's never lost a byte on me. The reflog is always there to fall back on. This time the carpet is gone!
From my perspective, all I did is run
git pull and it nuked my entire local repository. I don't mean it "messed up the checked out version" or "the branch I was on" or anything like that. I mean the entire thing is gone.
Here is a screen-shot of my terminal at the incident:
Let me walk you through that. My command prompt includes data about the current git repo (using prezto's vcs_info implementation) so you can see when the git repo disappeared. The first command is normal enough:
» caleb » jaguar » ~/p/w/incil.info » ◼ zend ★ » ❯❯❯ git co master Switched to branch 'master' Your branch is up-to-date with 'origin/master'.
There you can see I was on the 'zend' branch, and checked out master. So far so good. You'll see in the prompt before my next command that it successfully switched branches:
» caleb » jaguar » ~/p/w/incil.info » ◼ master ★ » ❯❯❯ git pull remote: Counting objects: 37, done. remote: Compressing objects: 100% (37/37), done. remote: Total 37 (delta 25), reused 0 (delta 0) Unpacking objects: 100% (37/37), done. From gitlab.alerque.com:ipk/incil.info + 7412a21...eca4d26 master -> origin/master (forced update) f03fa5d..c8ea00b devel -> origin/devel + 2af282c...009b8ec verse-spinner -> origin/verse-spinner (forced update) First, rewinding head to replay your work on top of it... >>> elapsed time 11s
And just like that it's gone. The elapsed time marker outputs before the next prompt if more than 10 seconds have elapsed. Git did not give any output beyond the notice that it was rewinding to replay. No indication that it finished.
The next prompt includes no data about what branch we are on or the state of git.
Not noticing it had failed I obliviously tried to run another git command only to be told I wasn't in a git repo. Note the PWD has not changed:
» caleb » jaguar » ~/p/w/incil.info » ❯❯❯ git fetch --all fatal: Not a git repository (or any parent up to mount point /home) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
After this a look around showed that I was in a completely empty directory. Nothing. No '.git' directory, nothing. Empty.
My local git is at version 2.0.2. Here are a couple tidbits from my git config that might be relevant to making out what happened:
[branch] autosetuprebase = always rebase = preserve [pull] rebase = true [rebase] autosquash = true autostash = true [alias] co = checkout
For example I have
git pull set to always do a rebase instead of a merge, so that part of the output above is normal.
I can recover the data. I don't think there were any git objects other than some unimportant stashes that hadn't been pushed to other repos, but I'd like to know what happened.
I have checked for:
- Messages in dmesg or the systemd journal. Nothing even remotely relevant.
- There is no indication of drive or file system failure (LVM + LUKS + EXT4 all look normal). There is nothing in lost+found.
- I didn't run anything else. There is nothing in the history I'm not showing above, and no other terminals were used during this time. There are no
rmcommands floating around that might have executed in the wrong CWD, etc.
- Poking at another git repo in another directory shows no apparent abnormality executing
What else should I be looking for here?