Wenn ich versuche, Änderungen festzuschreiben, wird folgende Fehlermeldung angezeigt:
error: object file .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0 is empty
fatal: loose object 3165329bb680e30595f242b7c4d8406ca63eeab0 (stored in .git/objects/31/65329bb680e30595f242b7c4d8406ca63eeab0) is corrupt
Irgendeine Idee, wie man diesen Fehler löst?
BEARBEITEN
Ich habe versucht, git fsck
ich habe:
error: object file .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71 is empty
fatal: loose object 03dfd60a4809a3ba7023cbf098eb322d08630b71 (stored in .git/objects/03/dfd60a4809a3ba7023cbf098eb322d08630b71) is corrupt
git add
Operation gewaltsam getötet ? Ist Ihre Festplatte voll?git fsck
sich darum gekümmert.Antworten:
Ich hatte ein ähnliches Problem. Mein Laptop hat während einer Git-Operation keinen Akku mehr. Boo.
Ich hatte keine Backups. (Hinweis: Ubuntu One ist keine Backup-Lösung für Git. Es überschreibt Ihr vernünftiges Repository hilfreich mit Ihrem beschädigten.)
Wenn dies ein schlechter Weg war, um das Problem zu beheben, hinterlassen Sie bitte einen Kommentar. Es hat jedoch bei mir funktioniert ... zumindest vorübergehend.
Schritt 1: Erstellen Sie eine Sicherungskopie von .git (tatsächlich mache ich dies zwischen jedem Schritt, der etwas ändert, aber mit einem neuen Copy-to-Namen, z. B. .git-old-1, .git-old-2 usw.) ::
Schritt 2: Ausführen
git fsck --full
Schritt 3: Entfernen Sie die leere Datei. Ich dachte mir was zum Teufel; es ist sowieso leer.
Schritt 3: Führen Sie
git fsck
erneut aus. Löschen Sie weiterhin die leeren Dateien. Sie können auchcd
in das.git
Verzeichnis gehen und ausführenfind . -type f -empty -delete -print
, um alle leeren Dateien zu entfernen. Irgendwann sagte mir Git, dass es tatsächlich etwas mit den Objektverzeichnissen zu tun habe:Schritt 4: Nachdem ich alle leeren Dateien gelöscht hatte, wurde ich schließlich
git fsck
tatsächlich ausgeführt:Schritt 5: Versuchen Sie es
git reflog
. Scheitern Sie, weil mein KOPF gebrochen ist.Schritt 6: Google. Finde das . Holen Sie sich manuell die letzten beiden Zeilen des Reflogs:
Schritt 7: Beachten Sie, dass wir aus Schritt 6 erfahren haben, dass der HEAD derzeit auf das allerletzte Commit zeigt. Versuchen wir also, nur das übergeordnete Commit zu betrachten:
Es funktionierte!
Schritt 8: Jetzt müssen wir HEAD auf 9f0abf890b113a287e10d56b66dbab66adc1662d zeigen.
Welches hat sich nicht beschwert.
Schritt 9: Sehen Sie, was fsck sagt:
Schritt 10: Der ungültige sha1-Zeiger im Cache-Baum schien aus einer (jetzt veralteten) Indexdatei ( Quelle ) zu stammen. Also habe ich es getötet und das Repo zurückgesetzt.
Schritt 11: Nochmals auf den fsck schauen ...
Die baumelnden Blobs sind keine Fehler . Ich beschäftige mich nicht mit master.u1conflict, und jetzt, wo es funktioniert, möchte ich es nicht mehr anfassen!
Schritt 12: Auf dem Laufenden bleiben mit meinen lokalen Änderungen:
Hoffentlich kann das den Menschen in Zukunft von Nutzen sein. Ich bin froh, dass es funktioniert hat.
quelle
Die Git-Objektdateien sind beschädigt (wie auch in anderen Antworten erwähnt). Dies kann bei Maschinenabstürzen usw. passieren.
Ich hatte das gleiche. Nachdem ich die anderen Top-Antworten hier gelesen hatte, fand ich den schnellsten Weg, um das kaputte Git-Repository mit den folgenden Befehlen zu reparieren (im Git-Arbeitsverzeichnis ausführen, das den
.git
Ordner enthält ):Dadurch werden zuerst alle leeren Objektdateien entfernt , die eine Beschädigung des gesamten Repositorys verursachen. Anschließend werden die fehlenden Objekte (sowie die letzten Änderungen) aus dem Remote-Repository abgerufen und anschließend eine vollständige Objektspeicherprüfung durchgeführt . Was an dieser Stelle ohne Fehler gelingen sollte (es kann jedoch noch einige Warnungen geben!)
quelle
Dieser Fehler tritt auf, wenn ich mein Commit drücke und mein Computer hängt. So habe ich es behoben.
Schritte zu beheben
Zeigen Sie die leere / beschädigte Objektdatei an
entfernen Sie es
Ich habe eine
fatal: bad object HEAD
Nachricht erhaltenIch entferne das
index
für den Resetfatal: Objekt 'HEAD' konnte nicht analysiert werden.
nur um zu überprüfen, was passiert
druckt die letzten 2 Zeilen
tail -n 2
des Protokollzweigs, um meine letzten 2 anzuzeigencommit hash
Ich wähle den letzten aus
commit hash
zeigt alle meine Dateien als
deleted
weil ich die.git/index
Datei entfernt habeFahren Sie mit dem Zurücksetzen fort
Überprüfen Sie mein Update
Hinweis: Die Schritte beginnen, wenn ich auf dieser Frage gelandet bin und die Antworten als Referenz verwendet habe.
quelle
Ich habe dieses Problem gelöst, indem ich die verschiedenen leeren Dateien entfernt habe, die git fsck erkannt hat, und dann einen einfachen git pull ausgeführt habe.
Ich finde es enttäuschend, dass jetzt, da sogar Dateisysteme Journaling und andere "Transaktions" -Techniken implementieren, um das fs gesund zu halten, git aufgrund eines Stromausfalls oder eines Speicherplatzes auf dem Gerät in einen beschädigten Zustand geraten kann (und nicht in der Lage ist, sich selbst wiederherzustellen).
quelle
Ich hatte nur das gleiche Problem: Nachdem ich das entfernte Repository abgerufen hatte, bekam ich beim Ausführen eines Git-Status Folgendes: "Fehler: Objektdatei (...) ist leer" "fatal: loses Objekt (...) ist beschädigt"
Die Art und Weise, wie ich das gelöst habe, war:
Ich weiß nicht genau, was passiert ist, aber diese Anweisungen schienen alles sauber zu machen.
quelle
cd .git/ && find . -type f -empty -delete
Da ich meine VM regelmäßig neu starten muss, passiert mir dieses Problem irgendwie sehr oft. Nach einigen Malen wurde mir klar, dass ich den von @ Nathan-Vanhoudnos beschriebenen Vorgang nicht jedes Mal wiederholen kann, obwohl dies immer funktioniert. Dann fand ich die folgende schnellere Lösung heraus.
Schritt 1
Verschieben Sie Ihr gesamtes Repo in einen anderen Ordner.
Schritt 2
Klonen Sie das Repo erneut vom Ursprung.
Schritt 3
Entfernen Sie alles unter dem neuen Repo außer dem Ordner .git .
Schritt 4
Bewegen Alles vom temp_repo zum neuen Repo außer dem .git Ordner.
Schritt 5
Entfernen Sie das temp_repo und wir sind fertig.
Ich bin mir sicher, dass Sie diese Prozeduren nach einigen Malen sehr schnell ausführen können.
quelle
git clone source_to_current_repo.git clean_repo
. 2) Sichern Sie den alten .git-Ordner. 3) Kopieren Sie über den sauberen .git-Ordner.Das ist alles. Vielleicht ist es nicht der beste Weg, aber ich denke, es ist so praktisch.
quelle
In meinem Fall ist dieser Fehler aufgetreten, weil ich die Festschreibungsnachricht eingegeben und mein Notizbuch ausgeschaltet habe.
Ich habe die folgenden Schritte ausgeführt, um den Fehler zu beheben:
git checkout -b backup-branch
# Erstellen Sie einen Sicherungszweiggit reset --hard HEAD~4
# Auf das Commit zurücksetzen, wo alles gut funktioniert. In meinem Fall musste ich 4 Commits im Kopf sichern, dh bis mein Kopf an dem Punkt war, an dem ich die Commit-Nachricht eingegeben hatte. Bevor Sie diesen Schritt ausführen, kopieren Sie den Hash der Commits, die Sie zurücksetzen möchten. In meinem Fall habe ich den Hash der 4 letzten Commits kopiertgit cherry-pick <commit-hash>
# Cherry wählt die zurückgesetzten Commits (in meinem Fall 4 Commits, also habe ich diesen Schritt 4 Mal ausgeführt) aus dem alten Zweig in den neuen Zweig.git push origin backup-branch
# Schieben Sie den neuen Zweig, um sicherzustellen, dass alles gut funktioniertgit branch -D your-branch
# Löschen Sie den Zweig lokal ('Ihr Zweig' ist der Zweig mit dem Problem)git push origin :your-branch
# Löschen Sie den Zweig von der Fernbedienunggit branch -m backup-branch your-branch
# Benennen Sie den Sicherungszweig um, um den Namen des Zweigs zu erhalten, bei dem das Problem aufgetreten istgit push origin your-branch
# Schieben Sie den neuen Zweiggit push origin :backup-branch
# Löschen Sie den Sicherungszweig von der Fernbedienungquelle
Löse mein Problem
quelle
git status
da einige leer sind.Hier ist eine wirklich einfache und schnelle Art und Weise mit diesem Problem umgehen IF Sie einen lokalen Repo mit allen Zweigen haben und verpflichtet Sie brauchen, und wenn Sie OK mit einer neuen Repo - Erstellung (oder Löschen des Repo - Server und macht eine neue an seinem Platz):
Dadurch bleiben alle Commit-Historien und Zweige erhalten, die Sie in Ihrem lokalen Repo hatten.
Wenn Sie Mitarbeiter im Repo haben, müssen Ihre Mitarbeiter in vielen Fällen nur die Remote-URL ihres lokalen Repos ändern und optional alle Commits übertragen, die der Server nicht hat.
Diese Lösung hat bei mir funktioniert, als ich auf dasselbe Problem gestoßen bin. Ich hatte einen Mitarbeiter. Nachdem ich mein lokales Repo auf das neue Remote-Repo verschoben hatte, änderte er einfach sein lokales Repo, um auf die Remote-Repo-URL zu verweisen, und alles funktionierte einwandfrei.
quelle
Ich hatte das gleiche Problem, nachdem mein Laptop abgestürzt war. Wahrscheinlich, weil es sich um ein großes Repository handelte, hatte ich einige beschädigte Objektdateien, die beim Aufrufen jeweils nur einzeln angezeigt
git fsck --full
wurden. Deshalb habe ich einen kleinen Shell-Einzeiler geschrieben, um eine davon automatisch zu löschen:$ sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`
2>&1
leitet die Fehlermeldung an stdout weiter, um sie abrufen zu können-o
Gibt nur den Teil einer Zeile zurück, der tatsächlich übereinstimmt-E
aktiviert erweiterte reguläre Ausdrücke-m 1
Stellen Sie sicher, dass nur die erste Übereinstimmung zurückgegeben wird[0-9a-f]{2}
stimmt mit einem der Zeichen zwischen 0 und 9 und a und f überein, wenn zwei von ihnen zusammen vorkommen[0-9a-f]*
Entspricht einer beliebigen Anzahl von Zeichen zwischen 0 und 9 und a und f, die zusammen vorkommenEs wird immer noch jeweils nur eine Datei gelöscht. Sie können sie daher in einer Schleife wie folgt aufrufen:
$ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; done
Das Problem dabei ist, dass es nichts Nützliches mehr ausgibt, sodass Sie nicht wissen, wann es fertig ist (es sollte nach einiger Zeit einfach nichts Nützliches mehr tun).
Um dies zu "beheben", habe ich dann
git fsck --full
nach jeder Runde wie folgt einen Aufruf hinzugefügt :$ while true; do sudo rm `git fsck --full 2>&1 | grep -oE -m 1 ".git/objects/[0-9a-f]{2}/[0-9a-f]*"`; git fsck --full; done
Es ist jetzt ungefähr halb so schnell, aber es gibt seinen "Zustand" aus.
Danach habe ich einige mit den Vorschlägen in diesem Thread herumgespielt und bin schließlich an einen Punkt gekommen, an dem ich konnte
git stash
undgit stash drop
viele der kaputten Sachen.erstes Problem gelöst
Danach hatte ich noch folgendes Problem:
unable to resolve reference 'refs/remotes/origin/$branch': reference broken
das konnte durch gelöst werden$ rm \repo.git\refs\remotes\origin\$branch
$ git fetch
Ich habe dann eine gemacht
$ git gc --prune=now
$ git remote prune origin
für ein gutes Maß und
git reflog expire --stale-fix --all
error: HEAD: invalid reflog entry $blubb
beim Laufen loswerdengit fsck --full
.quelle
Lassen Sie uns einfach gehen. Nur für den Fall, dass Sie die Quelle auf Remote Git Repo hochgeladen haben
Überprüfe deinen Git
leere Objektdatei entfernen (alle)
Überprüfe deinen Git noch einmal.
Ziehen Sie Ihre Quelle von Remote Git
quelle
Bei virtuellen Maschinen stoße ich häufig auf dieses Problem.
Für mich funktioniert folgendes:
Wenn Sie sich einige Downloads sparen möchten, gehen Sie in Ihren Datei-Explorer und löschen Sie alle Dateien in dem Ordner, die bereits festgeschrieben sind, und belassen Sie sie in Ihren Ordnern / vendor und / node_modules (ich arbeite mit Composer und npm).
dann erstelle einfach ein neues repo
Fügen Sie Ihre Fernbedienung hinzu
und holen Sie den Zweig / alles davon
und schau es dir an
dann sollten Sie an der Stelle vor dem Fehler sein.
Hoffe das hilft.
Grüße.
quelle
Ich habe das gleiche Problem und benutze eine sehr einfache Methode, um es zu beheben. Ich fand heraus, dass diese fehlenden Dateien auf dem Computer meines Teamkollegen vorhanden waren.
Ich habe diese Dateien einzeln auf einen Git-Server kopiert (insgesamt 9 Dateien), und das hat das Problem behoben.
quelle
Meine Kollegen und ich haben dieses Problem mehrmals gekreuzt. Um es zu lösen, führen wir einfach die Schritte aus, die ich unten beschreibe. Es ist nicht die eleganteste Lösung, die gefunden werden kann, aber es funktioniert ohne Datenverlust.
old_project
für dieses Beispiel).git clone
.old_project
(außer dem.git
Verzeichnis) in das neu erstellte Projektverzeichnis.Ich hoffe, es hilft...
quelle
Hier ist eine Möglichkeit, das Problem zu lösen, wenn Ihr öffentliches Repo auf github.com funktioniert, Ihr lokales Repo jedoch beschädigt ist. Beachten Sie, dass Sie alle Commits verlieren, die Sie im lokalen Repo ausgeführt haben.
Okay, ich habe also ein Repo vor Ort, das mir dies gibt
object empty error
, und dasselbe Repo auf github.com, aber ohne diesen Fehler. Also habe ich einfach das Repo, das von Github funktioniert, geklont und dann alles aus dem beschädigten Repo (außer dem Ordner .git) kopiert und das geklonte Repo, das funktioniert, eingefügt.Dies ist möglicherweise keine praktische Lösung (da Sie die lokalen Commits löschen). Sie behalten jedoch den Code und eine reparierte Versionskontrolle bei.
Denken Sie daran, ein Backup zu erstellen, bevor Sie diesen Ansatz anwenden.
quelle
In meinem Fall war es für mich nicht wichtig, den lokalen Commit-Verlauf beizubehalten. Wenn dies auch für Sie gilt, können Sie dies als schnelle Alternative zu den oben genannten Lösungen tun:
Sie ersetzen einfach das beschädigte
.git/
Verzeichnis durch ein sauberes.Nehmen wir das folgende Verzeichnis für Ihr Projekt mit dem beschädigten Git an:
projects/corrupt_git/
cp projects/corrupt_git projects/backup
- (optional) Backup erstellengit clone [repo URL] projects/clean_git
- damit du bekommstprojects/clean_git
rm -rf corrupt_git/.git/
- Entfernen Sie den beschädigten .git-Ordnermv clean_git/.git/ corrupt_git/
- Sauberes Git nach bewegencorrupt_git/.git
git status
inprojects/corrupt_git
- um sicherzustellen, dass es funktioniertquelle
Kopieren Sie alles (in dem Ordner, der die .git enthält) in eine Sicherung, löschen Sie dann alles und starten Sie neu. Stellen Sie sicher, dass Sie die Git-Fernbedienung zur Hand haben:
Dann
Führen Sie dann alle neuen Dateien manuell zusammen und versuchen Sie, Ihren Computer eingeschaltet zu lassen.
quelle
Hatte das gleiche Problem nach dem Auschecken des Masters aus einem sauberen Zweig. Nach einer Weile erkannte ich viele geänderte Dateien im Master. Ich weiß nicht, warum sie dort waren, nachdem sie von einer sauberen Filiale gewechselt sind. Wie auch immer, da die geänderten Dateien für mich keinen Sinn machten, habe ich sie einfach verstaut und der Fehler war verschwunden.
git:(master) git stash
quelle
Wenn Sie ein ALTES Backup haben und es eilig haben:
Erstellen Sie eine NEUE SICHERUNG Ihres aktuellen Projektpfads.
.git
in den Papierkorb (niemals löschen).git
aus dem ALTEN Backupgit pull
(führt zu Zusammenführungskonflikten)./src
(niemals löschen)git gui
, drücke und ... klatsche in die Hände!quelle
Die oben beschriebene zwölfstufige Lösung hat mir auch geholfen, aus einem Stau herauszukommen. Vielen Dank. Die wichtigsten Schritte waren:
und entfernen Sie alle leeren Objekte
Dann bekommen Sie die zwei Zeilen der Peitsche:
Mit den zurückgegebenen Werten
Zu diesem Zeitpunkt hatte ich keine Fehler mehr, daher habe ich eine Sicherungskopie meiner neuesten Dateien erstellt. Dann machen Sie einen Git-Pull, gefolgt von einem Git-Push. Kopierte meine Backups in meine Git-Repository-Datei und führte einen weiteren Git-Push durch. Das hat mich auf den neuesten Stand gebracht.
quelle
Ich habe meinen Git-Fehler behoben: Die Objektdatei ist leer durch:
Hoffe das hilft.
quelle
Das passiert mir auch fast regelmäßig. Ich habe kein Protokoll erstellt, wenn dies genau passiert, aber ich habe den Verdacht, dass es auftritt, wenn meine virtuelle Maschine "unerwartet" existiert. Wenn ich das VM-Fenster schließe (ich verwende Ubuntu 18.04) und erneut starte, funktionieren die Dinge immer (?). Wenn das VM-Fenster jedoch beim Herunterfahren meines Laptops (Windows-Hostsystem) noch geöffnet ist, tritt dieses Problem häufig auf.
Zu allen hier gegebenen Antworten:
danke - sie sind sehr nützlich; Normalerweise speichere ich eine lokale Kopie meines Codes, stelle das Repo von der Fernbedienung wieder her und verschiebe die Sicherungskopie zurück in den lokalen Ordner.
Da das zugrunde liegende Problem nicht wirklich ein Git-Problem ist, sondern ein VM- und / oder Linux-Problem, frage ich mich, ob es keinen Weg geben sollte, den Grund und nicht die Symptome zu heilen. Zeigt diese Art von Fehler nicht an, dass einige Dateisystemänderungen nicht in angemessener Zeit "angewendet", sondern nur zwischengespeichert werden? (Siehe zum Beispiel /unix/464184/are-file-edits-in-linux-directly-saved-into-disk ) - Für mich scheint es, als ob virtuelle Linux-Maschinen dies nicht tun fsynch ihre Sachen häufig genug. Ob dies ein Problem der VirtualBox von Oracle (das ansonsten sehr gut funktioniert) oder des Gastdateisystems oder einiger Einstellungen ist, die wir alle übersehen, liegt außerhalb meines Fachwissens. Aber ich würde mich freuen, wenn jemand Licht ins Dunkel bringen könnte.
quelle
Eigentlich hatte ich das gleiche Problem. Haben Sie eine Kopie Ihres Codes, bevor Sie dies versuchen.
Ich habe es gerade getan
git reset HEAD~
Mein letztes Commit wurde rückgängig gemacht, dann habe ich es erneut festgeschrieben, Problem gelöst!
quelle
Warnung: Mit mehr Erfahrung wird mir klar, dass dies die nukleare Option ist und normalerweise nicht durchgeführt werden sollte und nichts lehrt. In seltenen Fällen für persönliche Projekte fand ich es jedoch immer noch nützlich, also lasse ich es offen.
Wenn Sie Ihre historischen Verpflichtungen nicht einhalten möchten, führen Sie sie einfach aus
Beantworten Sie dann alle Fragen zum Löschen schreibgeschützter Dateien mit Ja. Problem in weniger als einer Minute gelöst.
quelle