Ich fühle mich wie ein Kind im Büro des Direktors, das erklärt, dass der Hund meine Hausaufgaben in der Nacht vor der Fälligkeit gefressen hat, aber ich starre einen verrückten Datenverlust ins Gesicht und kann nicht herausfinden, wie es passiert ist. Ich würde gerne wissen, wie git mein Repository als Ganzes fressen könnte! Ich habe schon oft Mist in die Verpackung gesteckt und es hat nie geblinzelt. Ich habe es verwendet, um ein 20-Gig-Subversion-Repo in 27-Gig-Repos aufzuteilen und das Foo aus ihnen herauszufiltern, um das Durcheinander zu entwirren, und es hat nie ein Byte an mir verloren. Der Reflog ist immer da, auf den man zurückgreifen kann. Diesmal ist der Teppich weg!
Aus meiner Sicht war alles, was ich getan habe, ausgeführt git pull
und mein gesamtes lokales Repository wurde zerstört. Ich meine nicht, dass es "die ausgecheckte Version durcheinander gebracht hat" oder "den Zweig, in dem ich war" oder ähnliches. Ich meine, die ganze Sache ist weg .
Hier ist ein Screenshot meines Terminals zum Vorfall:
Lassen Sie sich das erklären. Meine Eingabeaufforderung enthält Daten zum aktuellen Git-Repo (mithilfe der vcs_info-Implementierung von prezto), sodass Sie sehen können, wann das Git-Repo verschwunden ist. Der erste Befehl ist normal genug:
» caleb » jaguar » ~/p/w/incil.info » ◼ zend ★ »
❯❯❯ git co master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
Dort kann man sehen, dass ich im 'zend'-Zweig war und Master ausgecheckt habe. So weit, ist es gut. Sie werden in der Eingabeaufforderung vor meinem nächsten Befehl sehen, dass er erfolgreich die Zweige gewechselt hat:
» 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
Und einfach so ist es weg. Die Markierung für die abgelaufene Zeit wird vor der nächsten Eingabeaufforderung ausgegeben, wenn mehr als 10 Sekunden vergangen sind. Git hat keine Ausgabe ausgegeben, die über die Meldung hinausgeht, dass die Wiedergabe zurückgespult wird. Kein Hinweis darauf, dass es fertig ist.
Die nächste Eingabeaufforderung enthält keine Daten darüber, in welchem Zweig wir uns befinden oder in welchem Zustand sich Git befindet.
Als ich nicht merkte, dass es fehlgeschlagen war, versuchte ich ahnungslos, einen anderen Git-Befehl auszuführen, nur um zu erfahren, dass ich nicht in einem Git-Repo war. Beachten Sie, dass sich die PWD nicht geändert hat:
» 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).
Danach zeigte ein Blick in die Runde, dass ich mich in einem völlig leeren Verzeichnis befand. Nichts. Kein ".git" -Verzeichnis, nichts. Leeren.
Mein lokaler Git ist bei Version 2.0.2. Hier sind ein paar Kleinigkeiten aus meiner Git-Konfiguration, die relevant sein könnten, um herauszufinden, was passiert ist:
[branch]
autosetuprebase = always
rebase = preserve
[pull]
rebase = true
[rebase]
autosquash = true
autostash = true
[alias]
co = checkout
Ich habe zum Beispiel git pull
festgelegt, dass immer ein Rebase statt eines Merge durchgeführt wird, sodass ein Teil der obigen Ausgabe normal ist.
Ich kann die Daten wiederherstellen. Ich glaube, es gab keine anderen Git-Objekte als unwichtige Verstecke, die nicht in andere Repos verschoben wurden, aber ich würde gerne wissen, was passiert ist .
Ich habe nachgesehen auf:
- Nachrichten in dmesg oder im systemd-Journal. Nichts, was auch nur aus der Ferne relevant ist.
- Es gibt keine Hinweise auf einen Laufwerks- oder Dateisystemfehler (LVM + LUKS + EXT4 sehen alle normal aus). Es ist nichts in Fundsachen.
- Ich habe nichts anderes gelaufen. Es gibt nichts in der Geschichte, das ich oben nicht zeige, und in dieser Zeit wurden keine anderen Terminals verwendet. Es gibt keine
rm
Befehle, die in der falschen CWD usw. ausgeführt wurden. - Das Stöbern in einem anderen Git-Repo in einem anderen Verzeichnis zeigt keine offensichtliche Abnormalität beim Ausführen von
git pull
s.
Was sollte ich sonst noch suchen?
.git
nicht. Nichts macht das - was früher das Git-Stammverzeichnis war, enthält überhaupt nichts.