Mi sento come un bambino nell'ufficio del preside che spiega che il cane ha mangiato i compiti la sera prima che fosse dovuto, ma sto fissando un bug pazzo di perdita di dati in faccia e non riesco a capire come sia successo. Vorrei sapere come Git potrebbe mangiare il mio repository intero! Ho passato molte volte lo strizzatore e non ha mai battuto ciglio. L'ho usato per dividere un repository Subversion da 20 Gig in 27 repository git e filtrare il foo da loro per districare il casino e non ha mai perso un byte su di me. Il reflog è sempre lì su cui ripiegare. Questa volta il tappeto è sparito!
Dal mio punto di vista, tutto ciò che ho fatto è stato eseguito git pull
e ha rovinato il mio intero repository locale. Non intendo dire che "ha incasinato la versione estratta" o "il ramo in cui mi trovavo" o qualcosa del genere. Voglio dire, l'intera cosa è sparita .
Ecco una schermata del mio terminale all'incidente:
Lascia che ti accompagni attraverso quello. Il mio prompt dei comandi include dati sul repository git corrente (usando l'implementazione vcs_info di prezto) in modo da poter vedere quando il repository git è scomparso. Il primo comando è abbastanza normale:
» caleb » jaguar » ~/p/w/incil.info » ◼ zend ★ »
❯❯❯ git co master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
Lì puoi vedere che ero sul ramo 'zend' e ho controllato il maestro. Fin qui tutto bene. Vedrai nel prompt prima del mio prossimo comando che ha cambiato correttamente i rami:
» 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
E proprio così non c'è più. L'indicatore del tempo trascorso viene emesso prima del prompt successivo se sono trascorsi più di 10 secondi. Git non ha dato alcun risultato oltre l'avviso che stava riavvolgendo per riprodurre. Nessuna indicazione che sia finita.
Il prossimo prompt non include dati su quale ramo ci troviamo o sullo stato di git.
Non accorgendomi che era fallito, ho cercato inconsapevolmente di eseguire un altro comando git solo per sentirmi dire che non ero in un repository git. Nota che il PWD non è cambiato:
» 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).
Dopo questo uno sguardo in giro ha mostrato che ero in una directory completamente vuota. Niente. Nessuna directory '.git', niente. Vuoto.
Il mio git locale è alla versione 2.0.2. Ecco un paio di bocconcini dal mio git config che potrebbero essere rilevanti per capire cosa è successo:
[branch]
autosetuprebase = always
rebase = preserve
[pull]
rebase = true
[rebase]
autosquash = true
autostash = true
[alias]
co = checkout
Ad esempio, ho git pull
impostato di fare sempre un rebase anziché un'unione, quindi una parte dell'output sopra è normale.
Posso recuperare i dati. Non credo che ci fossero oggetti git diversi da alcuni oggetti non importanti che non erano stati spinti in altri repository, ma mi piacerebbe sapere cosa è successo .
Ho controllato per:
- Messaggi in dmesg o nel journal di systemd. Niente di rilevante neanche lontanamente.
- Non vi è alcuna indicazione di guasto dell'unità o del file system (LVM + LUKS + EXT4 sembrano tutti normali). Non c'è nulla in lost + found.
- Non ho fatto altro. Non c'è nulla nella storia che non sto mostrando sopra, e nessun altro terminale è stato usato in questo periodo. Non ci sono
rm
comandi in giro che potrebbero essere stati eseguiti nel CWD sbagliato, ecc. - Frugare in un altro repository git in un'altra directory non mostra alcuna anomalia apparente durante l'esecuzione di
git pull
s.
Cos'altro dovrei cercare qui?
.git
non esiste. Niente fa: quella che era la directory root di Git non contiene nulla.