Git-Repository nach dem Tod des Computers defekt

92

Mein Computer ist tot und jetzt ist eines meiner Git-Repositories kaputt. Wenn ich versuche, den Master auszuchecken, wird Folgendes angezeigt:

warning: ignoring broken ref refs/heads/master.
error: Your local changes to the following files would be overwritten by checkout:
        com.vainolo.jdraw2d.releng.p2/pom.xml
Please, commit your changes or stash them before you can switch branches.
Aborting

Wenn ich ausführe, git stashbekomme ich:

fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet

Was kann ich also tun?

Aktualisieren Ausgabe git reflog:

fatal: bad default revision 'HEAD'

Nicht sehr vielversprechend ... Ausgabe von git fsck:

error: Invalid HEAD
Checking object directories: 100% (256/256), done.
error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt
vainolo
quelle
Können Sie überprüfen, ob .git/refs/heads/mastervorhanden ist und ob der Inhalt ein gültiger Commit-Hash Ihres Repositorys ist (Sie können dies überprüfen, z. B. mithilfe von git show <hash>)?
stupsen
Ich weiß, dass dies offensichtlich ist, frage aber immer noch: Haben Sie Remote-Repos mit demselben Git-Repo?
Tuxdude
@poke der Inhalt von .git/refs/heads/master/sind ein Haufen^@
vainolo
@Tuxdude yep, aber nicht auf meine neuesten Änderungen aktualisiert
vainolo
1
Was git reflogsagt dir das? Hast du versucht zu rennen git fsck?
Kynan

Antworten:

171

Ich konnte mich erholen durch:

rm .git/refs/remotes/origin/HEAD
git fetch --all
Julian Frumar
quelle
In meinem Fall geschah dies, weil ich einige lokale und entfernte Zweige gelöscht hatte (irgendwie blieb die Datei .git / refs / remotes / origin / HEAD in einem inkonsistenten Zustand). Das Ändern des Inhalts der oben genannten Datei, um auf einen vorhandenen lokalen Zweig zu verweisen (z. B. ref: refs / remotes / origin / master), löste dieses Problem. Der obige Ansatz ist jedoch möglicherweise besser, da HEAD möglicherweise auf ein Commit verweist, das sich nicht in der aktuellen Verzweigung befindet.
Crissdev
Falls das Problem bei einem bestimmten Git-Submodul rm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
auftritt,
1
Ich musste tun rm -rf .git/refs/remotes/origin, aber du hast mich in die richtige Richtung
Jacka
23

Befolgen Sie zunächst die unter Wiederherstellen eines defekten Git-Repositorys vorgeschlagenen Schritte :

  • Überprüfen Sie, ob .git/refsnoch etwas Nützliches enthalten ist
  • Überprüfen Sie, git reflogob der Inhalt .git/logs/refs/heads/masteroder der Zweig, in dem Sie sich zuletzt befanden, fehlgeschlagen ist
  • laufen git fsck, möglicherweise mit --unreachableoder--lost-found

Auf diese Weise können Sie hoffentlich herausfinden, wie der masterRef lauten sollte, damit Sie ihn wiederherstellen können (dh den richtigen SHA1 einfügen .git/refs/heads/master).

Falls ein in diesem Commit enthaltenes Objekt wirklich beschädigt ist, können Sie Ihr HEADCommit leider nicht wiederherstellen . Angenommen, Ihr Arbeitsbaum und / oder Index sind intakt, können Sie versuchen git reset --soft(oder fehlschlagen git reset), das vorherige Commit durchzuführen, und dann das Commit erneut ausführen. Vermeiden Sie alle Operationen , die Ihre Arbeits Baum sa ändern git checkout -foder git reset --hard.

kynan
quelle
Ich sah zu .git/logs/refs/heads/mybranch. Es zeigt eine Art Geschichte von Commits für diesen Zweig. Beim Durchstöbern habe ich SHAs ausgewählt und versucht, sie mit anzuzeigen git show. (Jedes Commit hat zwei SHAs, ich habe das zweite ausgewählt, kurz vor dem Namen des Autors.) Das letzte war korrupt, aber das vorhergehende konnte git shown sein, und ich konnte es dann mit pushen git push origin abcdef:mybranch.
Ed Avis
12

Ich hatte ein ähnliches Problem nach einem Bluescreen des Todes unter Windows 8.1

Ich hatte eine Datei an diesem Ort ...

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

Und es war leer, während die anderen Zweigdateien in diesem Ordner lange Zeichenfolgen enthalten.

NB Ich hatte keine Änderungen / Commits

  • Ich habe die <problem-branch>Datei gesichert
  • Datei gelöscht
  • git fetch --all um den Zweig wieder zu bekommen

Dann begann die automatische Vervollständigung der Registerkarte wieder zu funktionieren

Carlton
quelle
6

Wenn es nicht viele geänderte Dateien gibt, ist der bequeme Weg, um dieses Problem zu lösen, meiner Meinung nach:

  1. Sichern Sie die Dateien, die Sie im Repo geändert haben
  2. Entfernen Sie Ihr vorhandenes Repo
  3. Klonen Sie es erneut vom Server
  4. Fügen Sie die Dateien aus Schritt 1 in das Repo ein und git commit -a
alsotang
quelle
Ja, niemand konnte daran denken, erneut zu klonen. toller Vorschlag
Selman Genç
5

Ich habe es geschafft, dies durch Löschen der Master-Datei im Verzeichnis git \ refs \ Heads zu lösen

Manos Gaitanakis
quelle
Dies hat geholfen, es hat den Zweig von meiner Liste auf Intellij entfernt und ich habe ihn als neuen Zweig ausgecheckt. Zum Glück hatte ich meine Änderungen so verschoben, dass sie alle da waren.
OAM
4

Nach einem berechneten Einfrieren und Absturz wurde mein Git-Zweig mit der Meldung beschädigt : git fatal: your current branch appears to be broken. Ich könnte nichts machen.

Nachdem git fsckerwähnt wurde, dass die Niederlassung eine hatte error: Invalid HEAD. refs/heads/<branch>hatte eine invalid sha1 pointer.

Nachdem ich den Optionen hier .git/refs/heads/<branch>gefolgt war , öffnete ich sie in einem Editor für Editor ++ und jedes der sha1-Zeichen war NUL.

Zum Glück musste ich den Zweig nur auf den Remote-Status zurücksetzen, und das war auf einem Bitbucket-Repo. Ich nahm den sha1 von der Spitze des Remote-Repos und kopierte ihn in den .git/refs/heads/<branch>gespeicherten, dann machte ich einen git reset --hard HEADund alles wieder normal.

j4v1
quelle
2

Ich war idiotisch genug, um zu vergessen, zu pushen, und mein Computer stürzte ab, während ich ein Commit durchführte. Ich konnte jedoch alles außer dem letzten Commit wiederherstellen, indem ich .git / logs / refs / Heads / öffnete.

Diese Datei enthält alle Commits (mit ihren SHAs) für den Zweig. Was ich getan habe, um sie wiederherzustellen, war:

  • Sichern Sie die letzten Änderungen in einem temporären Ordner
  • Bewegen Sie sich zu einem "sauberen Schiefer"
    • git checkout master
    • git reset --hard
  • Überprüfen Sie das vorletzte Commit im Protokoll
  • Erstellen Sie einen Zweig aus diesem abgetrennten Kopf
  • DRÜCKEN
  • Stellen Sie die neuesten Änderungen wieder her
  • Wieder festschreiben

Selbst wenn Sie einen dummen Fehler machen, werden Sie nicht sofort von einem ganzen Arbeitstag mit git zurückgenommen :)

Markus Palcer
quelle
1

Ich weiß, dass es eine zu späte Antwort ist, aber ich habe diesen Fehler erhalten, weil ich keine hatte origin/head. Sie können dies durch Ausführen herausfinden git branch -r. Wenn Sie nicht sehen, dass Sie origin/headauf einen entfernten Ursprung zeigen, können Sie dies durch Ausführen festlegen git remote set-head origin {{your branch name}}.

Laufen git branch -rSie jetzt noch einmal und Sie sollten so etwas sehen: origin/HEAD -> origin/develop

Ich hoffe, dies hilft allen anderen, die auf dieses Problem stoßen.

aaronwbrown
quelle
1

Ich konnte meinen Hauptzweig nicht auschecken, da der Ref-Fehler nicht gesperrt werden konnte. Am Ende habe ich gelöscht: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

und diesen git-Befehl aufrufen:

git fetch --all
Keon Sadatian
quelle
1

Verzeihen Sie mir, wenn ich nach jemandem wiederholen würde (ich habe nicht alle Rückmeldungen gelesen). Meiner Meinung nach ist der einfachste Weg, das Problem zu lösen, das Projekt ohne .git und .idea zu kopieren, es zu bereinigen, von git zu klonen, alles außer den oben genannten Verzeichnissen zu löschen und dann die vorherige Kopie mit .git und .idea in das neu erstellte Repo einzufügen . Hoffe es macht Sinn.

Andrey Sulay
quelle
1

Mein Computer stürzte zweimal ab und mein Git-Repository wurde lokal beschädigt. Ich konnte meine Änderungen nicht abrufen, es wurde gefragt, ob der Remote-Ursprung festgelegt werden soll, aber es funktionierte nicht in gitKraken.

An meiner Eingabeaufforderung wurde dieser Fehler angezeigt Geben Sie hier die Bildbeschreibung ein

Ich wusste, dass meine Referenzen kaputt sind und repariert werden müssen. Was ich tun musste, war, Bash zu spielen (Klicken Sie in SourceTree auf "Terminal"). Navigieren Sie dann zu einem solchen Referenzordner

cd .git
cd refs
cd remotes
cd origin

Dort wird ein Dateiname angezeigt master, mit lsdem Sie sehen können, was sich im Verzeichnis befindet. Dann löschen Sie es einfach mit rm master

bam, die beschädigte Datei ist weg. Wenn Sie nun den Befehl git branch -a ausgeben, wird dieser ausgegeben

$ git branch -a
* master
  remotes/origin/master (this in red color -scary :) )

Geben Sie dann diesen Befehl ein, und Ihre Referenzen werden korrigiert

$ git remote set-head origin master

Zusammenfassend sollte beim Versuch, die Fernbedienung zu ziehen, der leere Name der Fernbedienung angezeigt werden, der behoben wurde.

Geben Sie hier die Bildbeschreibung ein

Hammad Khan
quelle
0

Ich hatte das gleiche Problem, aber kein Glück, konnte das Problem nicht herausfinden. Ich nahm mein Repo zur Seite, klonte das Repo erneut vom Server und versuchte, es zwischen ihnen zusammenzuführen. Natürlich wurden viele Dateien angezeigt, die nicht mit meinem Zweig zusammenhängen, aber helfen, die erforderlichen Dateien zu isolieren.

Samuelens
quelle
0

Überprüfen Sie, ob MSWindows desktop.ini-Dateien erstellt hat, die das Git unterstützen. es tut für mich. Sobald ich sie alle in den Unterordnern des .git-Verzeichnisses lösche, funktioniert es.

vinnief
quelle
0

Ich hatte das gleiche Problem, als Android Studio plötzlich beendet wurde (aufgrund eines Stromausfalls am Computer).

Ich habe es gelöst, indem ich den Inhalt meiner C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\masterDatei in meine C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\masterDatei kopiert habe .

(Früher hatte ich in Android Studio auch die Option "Push erzwingen" aktiviert, aber ich denke nicht, dass dies ein notwendiger Schritt war.)

Hinweis:

Ich habe diese Lösung gefunden, indem ich den Inhalt der Dateien in meinem C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\Verzeichnis (inkl. Unterverzeichnisse) mit den entsprechenden Dateien in einem anderen fehlerfreien Projekt verglichen habe - z C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\.

Möglicherweise haben Sie eine andere Datei, die beschädigt ist. Wenn Sie jedoch mit einem anderen fehlerfreien Projekt vergleichen, sollten Sie schnell erkennen können, was falsch ist.

Wenn Sie kein anderes fehlerfreies Projekt haben, für das git konfiguriert ist, kann es sich lohnen, ein einfaches Projekt auf die gleiche Weise zu erstellen, wie Sie Ihr fehlerhaftes Projekt erstellt haben, damit Sie es untersuchen, vergleichen und beheben können.

PS - Meine Fehlermeldung (bearbeitet) war: warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --

Ban-Geoengineering
quelle