Il repository Git si è rotto dopo che il computer è morto


94

Il mio computer è morto e ora uno dei miei repository git è danneggiato. Quando provo a fare il checkout master mi dice:

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

Quando eseguo git stashottengo:

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

Quindi cosa posso fare?

Aggiorna output di git reflog:

fatal: bad default revision 'HEAD'

Non molto promettente ... Risultato di 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

Puoi controllare se .git/refs/heads/masteresiste e se il suo contenuto è un hash di commit valido del tuo repository (puoi verificarlo ad esempio usando git show <hash>)?
colpisci il

So che è ovvio, ma mi chiedo ancora: hai repository remoti dello stesso repository git?
Tuxdude

@ ha parlato del contenuto di .git/refs/heads/master/sono un mucchio di^@
vainolo

@Tuxdude sì, ma non aggiornato alle mie ultime modifiche
vainolo

1
Cosa git reflogti dice? Hai provato a correre git fsck?
kynan

Risposte:


173

Sono riuscito a recuperare attraverso:

rm .git/refs/remotes/origin/HEAD
git fetch --all

Nel mio caso è successo perché ho cancellato alcuni rami locali e remoti (in qualche modo il file .git / refs / remotes / origin / HEAD è rimasto in uno stato incoerente). La modifica del contenuto del file sopra menzionato per puntare a un ramo locale esistente (ad esempio ref: refs / remotes / origin / master) ha risolto questo problema. Tuttavia, l'approccio sopra potrebbe essere migliore poiché HEAD potrebbe puntare a un commit non nel ramo corrente.
crissdev

Nel caso in cui il problema si verifichi su uno specifico sottomodulo git, il primo comando cambia leggermente inrm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
Gobe

1
Ho dovuto fare rm -rf .git/refs/remotes/origin , ma tu mi hai indicato la giusta direzione
Jacka

23

Inizia seguendo i passaggi suggeriti in Ripristino del repository git danneggiato :

  • controlla se .git/refscontiene ancora qualcosa di utile
  • controllare git refloge in caso contrario che il contenuto di .git/logs/refs/heads/mastero qualsiasi ramo in cui ti trovavi per ultimo
  • correre git fsck, potenzialmente con --unreachableo--lost-found

Si spera che questo ti permetta di capire quale masterdovrebbe essere il ref in modo da poterlo ripristinare (cioè inserire il corretto SHA1 in .git/refs/heads/master).

Nel caso in cui un oggetto contenuto in quel commit sia realmente danneggiato, HEADsfortunatamente non puoi ripristinare il tuo commit. Supponendo che il tuo albero di lavoro e / o l'indice siano intatti, puoi provare a git reset --soft(o in mancanza di quello a git reset) al commit precedente e quindi ripetere il commit. Evita qualsiasi operazione che modifichi il tuo albero di lavoro sagit checkout -f o git reset --hard.


Ho guardato .git/logs/refs/heads/mybranch. Mostra una sorta di cronologia dei commit in questo ramo. Scavando a fondo ho scelto gli SHA e ho cercato di mostrarli con git show. (Ogni commit ha due SHA, ho scelto il secondo, appena prima del nome dell'autore.) L'ultimo era danneggiato ma quello prima poteva essere git shown e sono stato in grado di spingerlo con git push origin abcdef:mybranch.
Ed Avis

12

Ho avuto un problema simile a seguito di una schermata blu della morte su Windows 8.1

Avevo un file in questa posizione ...

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

Ed era vuoto mentre gli altri file di ramo in questa cartella contengono lunghe stringhe al loro interno.

NB Non ho avuto modifiche / commit

  • Ho eseguito il backup del <problem-branch>file
  • File cancellato
  • git fetch --all per riavere il ramo

Quindi il completamento automatico della scheda ha iniziato a funzionare di nuovo


6

Se non ci sono molti file modificati, penso che il modo conveniente per risolvere questo problema sia:

  1. eseguire il backup dei file modificati nel repository
  2. rimuovere il repository esistente
  3. ri-clonarlo dal server
  4. incolla i file dal passaggio 1 al repository e git commit -a

sì, nessuno poteva pensare di ri-clonare. ottimo suggerimento
Selman Genç

5

sono riuscito a risolverlo eliminando il file master nella directory git \ refs \ heads


Ciò ha aiutato, ha rimosso il ramo dal mio elenco su intellij e l'ho verificato come nuovo ramo. Fortunatamente avevo spinto le mie modifiche in modo che fossero tutte lì.
OAM

4

Dopo un congelamento calcolata e crash, il mio ramo git è stata danneggiata con il messaggio: git fatal: your current branch appears to be broken. Non ho potuto fare niente.

Dopo aver fatto git fsckmenzionato che il ramo aveva un file error: Invalid HEAD. refs/heads/<branch>aveva un invalid sha1 pointer.

Dopo aver seguito le opzioni qui, ho aperto .git/refs/heads/<branch>in un editor di blocco note ++ e ciascuno dei caratteri sha1 eraNUL .

Fortunatamente avevo solo bisogno di resettare il ramo allo stato remoto, e questo era su un repository bitbucket. Ho afferrato lo sha1 dalla punta del repository remoto e l' .git/refs/heads/<branch>ho copiato nel salvarlo, quindi ho fatto un git reset --hard HEADe tutto è tornato alla normalità.


2

Sono stato abbastanza idiota da dimenticare di spingere e il mio computer si è bloccato durante l'esecuzione di un commit. Potrei recuperare tutto tranne l'ultimo commit aprendo .git / logs / refs / heads /

Questo file contiene tutti i commit (con i loro SHA) al ramo, quello che ho fatto per recuperare è stato:

  • Eseguire il backup delle ultime modifiche in una cartella temporanea
  • passare a una "lavagna pulita"
    • git checkout master
    • git reset --hard
  • checkout il penultimo commit nel registro
  • creare un ramo da questa testa staccata
  • SPINGERE
  • Ripristina le ultime modifiche
  • Impegnati di nuovo

Quindi, anche quando commetti un errore stupido, non sei immediatamente ripreso da un'intera giornata di lavoro con git :)


1

So che è una risposta troppo tarda, ma ho ricevuto questo errore perché non avevo un origin/head. Puoi scoprirlo correndo git branch -r. Se non vedi che stai origin/headpuntando a un'origine remota, puoi impostarlo eseguendo git remote set-head origin {{your branch name}}.

Ora corri di git branch -rnuovo e dovresti vedere qualcosa del genere: origin/HEAD -> origin/develop

Spero che questo aiuti chiunque altro stia riscontrando questo problema.


1

Non ho potuto effettuare il checkout del mio ramo principale a causa dell'errore di rif. Impossibile bloccare. Ho finito per eliminare: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

e chiamando questo comando git:

git fetch --all

1

Perdonami se ripeto dopo qualcuno (non ho letto tutti i feedback). A mio parere, il modo più semplice per risolvere il problema è copiare il progetto senza .git e .idea, pulirlo, clonarlo da git, eliminare tutto tranne le directory sopra e quindi incollare la copia precedente nel repository appena creato con .git e .idea . Spero abbia senso.


1

Il mio computer si è bloccato due volte e di conseguenza, il mio repository git è stato danneggiato localmente. Non ho potuto tirare le mie modifiche, ha chiesto di impostare l'origine remota ma non ha funzionato in gitKraken.

Sul mio prompt dei comandi, stavo ricevendo questo errore inserisci qui la descrizione dell'immagine

Sapevo che i miei riferimenti sono interrotti e devono essere corretti. Quello che dovevo fare è git bash (in SourceTree fare clic su "terminale"). Quindi vai alla cartella dei riferimenti come questa

cd .git
cd refs
cd remotes
cd origin

ci sarà un nome di file masterlì, usare lsper vedere cosa c'è nella directory. Quindi cancellalo semplicemente usando rm master

bam, il file danneggiato è sparito. Ora se si emette il comando git branch -a, verrà visualizzato questo

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

Quindi emetti questo comando e correggerà i tuoi riferimenti

$ git remote set-head origin master

Per riassumere, se provassi a tirare il telecomando, dovrebbe mostrare il nome remoto vuoto che è stato corretto.

inserisci qui la descrizione dell'immagine


0

Ho avuto lo stesso problema ma senza fortuna, non sono riuscito a capire il problema. Ho messo da parte il mio repository, ho ri-clonato quello dal server e ho provato a unirli tra loro. Ovviamente mostrava molti file non correlati al mio ramo, ma aiutava a isolare i file richiesti.


0

Controlla se MSWindows ha creato file desktop.ini che fanno parte di git? lo fa per me. Una volta che li ho eliminati tutti nelle sottocartelle della directory .git, funziona.


0

Ho avuto lo stesso problema quando Android Studio si è interrotto improvvisamente (a causa della perdita di alimentazione del computer).

L'ho risolto copiando il contenuto del mio C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\masterfile nel mio C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\masterfile.

(In precedenza, avevo anche attivato l'opzione "Force Push" in Android Studio, ma non credo che questo fosse un passaggio necessario.)

Nota:

Ho trovato questa soluzione confrontando il contenuto dei file nella mia C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\directory (incluse le sottodirectory) con i file corrispondenti di quelli in un altro progetto integro , ad esempio C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\.

Potresti avere un file diverso che è danneggiato, ma confrontandolo con un altro progetto sano, dovresti essere in grado di individuare rapidamente cosa non va.

Se non hai un altro progetto sano con git configurato, potrebbe valere la pena crearne uno semplice nello stesso modo in cui hai creato il tuo progetto non funzionante in modo da poter indagare, confrontare e correggere, ecc.

PS - Il mio messaggio di errore (modificato) era: 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 --

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.