git pull fallisce "impossibile risolvere il riferimento" "impossibile aggiornare ref locale"


606

Usando git 1.6.4.2, quando ho provato a git pullottengo questo errore:

error: unable to resolve reference refs/remotes/origin/LT558-optimize-sql: No such file or directory
From git+ssh://remoteserver/~/misk5
 ! [new branch]      LT558-optimize-sql -> origin/LT558-optimize-sql  (unable to update local ref)
error: unable to resolve reference refs/remotes/origin/split-css: No such file or directory
 ! [new branch]      split-css  -> origin/split-css  (unable to update local ref)

Ci ho provato git remote prune origin, ma non ha aiutato.


Risposte:


929

Prova a ripulire il tuo repository locale con:

$ git gc --prune=now
$ git remote prune origin

man git-gc (1):

git-gc - Cleanup unnecessary files and optimize the local repository

git gc [--aggressive] [--auto] [--quiet] [--prune=<date> | --no-prune]

       Runs a number of housekeeping tasks within the current repository, such as compressing file revisions
       (to reduce disk space and increase performance) and removing unreachable objects which may have been
       created from prior invocations of git add.

       Users are encouraged to run this task on a regular basis within each repository to maintain good disk
       space utilization and good operating performance.

man git-remote (1):

git-remote - manage set of tracked repositories

git remote prune [-n | --dry-run] <name>

           Deletes all stale remote-tracking branches under <name>. These stale branches have already been
           removed from the remote repository referenced by <name>, but are still locally available in
           "remotes/<name>".            

96
Perché funziona? Qual è il problema che risolve?
Ikke,

5
Il secondo comando ha funzionato per me. Apparentemente avevo un riferimento rotto a un ramo remoto appena creato. Non sono sicuro di come sia successo, ma sono contento che sia stata una soluzione semplice. Grazie Vitek!
JGTaylor,

1
Questo ha funzionato perfettamente! Mi piacerebbe anche una spiegazione di ciò che fa e perché ha funzionato. Grazie!
ArielSD,

4
Il git remote prune origincomando verrà eseguito sulla mia copia di lavoro locale o sul repository remoto?
user1438038,

3
@ user1438038 Non dovrebbe rimuovere alcun ramo e aggiornare solo i riferimenti remoti nella copia di lavoro locale. Maggiori informazioni qui: stackoverflow.com/questions/20106712/...
Zengineer

606

È successo anche a me. Nel mio caso, il cattivo riferimento era master e ho fatto quanto segue:

rm .git/refs/remotes/origin/master
git fetch

Ciò ha reso git ripristinare il file ref. Dopodiché tutto ha funzionato di nuovo come previsto.


1
Ho fatto la stessa cosa e ho risolto il mio problema. Quando ho aperto il file in Notepad ++, è stato chiaramente danneggiato.
theMayer,

83
assicurati di scegliere il file che ti dà problemi invece di master
bia.migueis

6
@ bia.migueis: non danneggerà nulla se rimuovi accidentalmente anche il master, ma verrà aggiornato anche al prossimo recupero.
naught101

2
Se si tratta di un sottomodulo, potrebbe essere leggermente complicato trovare il riferimento. Per prima cosa controlla se .gitè una cartella facendo ls -laaltrimenti, vedi il contenuto del .gitfile per trovare l'effettiva cartella .git in cui si trovano i riferimenti. .gitcontenuto del file nel mio caso: gitdir: ../.git/modules/my-submodule-name
CCoder

1
Due volte nell'ultimo anno sono tornato a dover riparare questo e ancora, questa è l'unica soluzione che funziona davvero.
Ted

131

Questo ha fatto il lavoro per me:

git gc --prune=now

5
Questo ha funzionato. Grazie per avermi salvato la giornata! @Bernd Qualche possibile spiegazione del comando?
nashcheez,

i documenti git gc sono qui
BigRon,

1
Ha funzionato anche per me. Non git remote prune origin
avevo

87

Per me, ha funzionato per rimuovere i file che generano errori dalla cartella .git/refs/remotes/origin/.


quello lo ha fatto! Ma solo per curiosità sai perché questo errore è arrivato? (tutto funzionava bene e all'improvviso un giorno è comparso questo errore). E sai anche come l'eliminazione del file lo ha risolto?
Shreyans,

È bello sapere che è stato risolto anche per te. Ad essere sincero, non ho idea di cosa abbia causato l'errore. Il mio pensiero era che uno dei file nella cartella non fosse sincronizzato. Dato che nessuna delle altre correzioni che ho trovato ha funzionato per me, l'ho usata come ultima risorsa.
Brian van Rooijen,

Ha funzionato alla grande! Si noti che è necessario eliminare tutti i file che causano il problema (in base al rapporto di errore che si sta ottenendo), come se si eliminasse solo uno e si provasse a tirarlo tornerà.
Rayee Roded,

1
Una delle possibili cause potrebbe essere l'arresto anomalo del sistema, come ho descritto nella mia risposta . Molte applicazioni della GUI di Git eseguono periodicamente Git sul repository (per aggiornare lo stato) e se il sistema si arresta in modo anomalo mentre Git sta manipolando i riferimenti, potrebbero finire per riscrivere con NULLs.
David Ferenczy Rogožan,

53

Provalo:

git gc --prune=now

git remote prune origin

git pull

26
Sebbene ciò possa rispondere alla domanda degli autori, manca alcune parole esplicative e / o collegamenti alla documentazione. Gli snippet di codice non elaborati non sono molto utili senza alcune frasi attorno a loro. Puoi anche trovare molto utile come scrivere una buona risposta . Modifica la tua risposta
Roy Scheffers,

Proprio il punto. Non è sufficiente correggere il codice e basta. Spero che ci sia una spiegazione
Musikero31,

1
git gc --prune = ora aggiorna il repository locale eliminando i file non necessari. Funziona bene per me.
Vasyl Gutnyk,

45

Esegui i seguenti comandi:

rm .git/refs/remotes/origin/master

git fetch

git branch --set-upstream-to=origin/master

Per ogni evenienza, se hai bisogno di sapere cos'è .git/refs/remotes/origin/master, leggi la sezione Telecomandi in Riferimenti Git .


1
Puoi spiegarci cos'è .git / refs / remotes / origin / branchName? Questa soluzione ha funzionato per me
caitcoo0odes

44

Vorrei solo aggiungere come può accadere che un riferimento si interrompa.

Possibile causa alla radice

Sul mio sistema (Windows 7 64-bit), quando un BSOD accade , alcuni dei file di riferimento memorizzati (più probabile attualmente aperte / stato scritto in quando BSOD accaduto) vengono sovrascritti con NULLcaratteri ASCII (0).

Come altri hanno già detto, per risolverlo, è sufficiente eliminare quei file di riferimento non validi e recuperare nuovamente il repository.

Esempio

Errore: cannot lock ref 'refs/remotes/origin/some/branch': unable to resolve reference 'refs/remotes/origin/some/branch': reference broken

Soluzione: eliminare il file%repo_root%/.git/refs/remotes/origin/some/branch


1
Stesso scenario su Windows 10 a 64 bit: funziona in un repository git quando si verifica BSOD. error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken. Prova a git pulldopo aver eliminato il primo file restituito fatal: update_ref failed for ref 'HEAD': cannot lock ref 'HEAD': unable to resolve reference 'refs/heads/master': reference broken. Dopo aver eliminato il secondo file ha git pull origin masteravuto esito positivo.
cjmcdonn,

39

Ho avuto lo stesso problema e l'ho risolto andando al file su cui stava commettendo errori:

\repo\.git\refs\remotes\origin\master

Questo file era pieno di null, l'ho sostituito con l'ultimo ref di Github.


2
Aveva lo stesso problema, ma il file .git/refs/remotes/origin/masterera vuoto. Risolto il problema rimuovendolo.
zinovyev,

38

Nel mio caso, il problema è stato risolto dopo aver eliminato tutti i file di riferimento di rimozione nella directory .git .

Se guardi il messaggio, ti dirà quali file devi eliminare (in particolare).

I file da eliminare si trovano sotto .git/refs/remotes.

Ho appena cancellato tutti i file e ho eseguito gc prune

git gc --prune=now

Dopodiché, tutto funziona bene.


Nel mio caso elimino solo .git / refs / remotes e quindi aggiorno e spingo sul server e ha funzionato.
Faraz Ahmed,

Grazie Uri. Nel mio caso ho appena cancellato i file sotto refs / remotes / origin / feature e l'ho fatto semplicemente - git pull
Deepboy

26

Spiegazione : Sembra che i rami del tuo repository remoto (in Github / bitbucket) siano stati rimossi, anche se i riferimenti locali non sono stati aggiornati e puntano a riferimenti inesistenti.

Per risolvere questo problema:

git fetch --prune
git fetch --all
git pull

Per ulteriori letture - Riferimento dalla documentazione di Github :

git-fetch - Scarica oggetti e riferimenti da un altro repository

--all Recupera tutti i telecomandi.

--prune Dopo il recupero, rimuovi tutti i rami di tracciamento remoti che non esistono più sul telecomando.


1
Questo ha funzionato per me
Onengiye Richard il

1
Grazie, ha funzionato per me.
Sam,

17

git fetch --prune risolto questo errore per me:

[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:25]
[I]> git fetch
error: cannot lock ref 'refs/remotes/origin/user/janek/integration/20170505': 'refs/remotes/origin/user/janek/integration' exists; cannot create 'refs/remotes/origin/user/janek/integration/20170505'
From github.com:zooxco/driving
 ! [new branch]            user/janek/integration/20170505 -> origin/user/janek/integration/20170505  (unable to update local ref)
From github.com:zooxco/driving
[marc.zych@marc-desktop] - [~/code/driving] - [Wed May 10, 02:58:30]
[I]> git fetch --prune
 - [deleted]               (none)     -> origin/user/janek/integration

Ciò presuppone tuttavia che il ramo offensivo sia stato eliminato sul telecomando.


Il tuo esempio sembra incompleto: non mostra --pruneciò che posso vedere. Suggerimento anche: rimuovere le richieste di password inutili dopo aver incollato gli esempi.
MarkHu,

Hai assolutamente ragione: ho lasciato l'output del comando fetch ma l'ho appena inserito nell'esempio. Grazie per il consiglio su come rimuovere anche la richiesta della password!
marczych,

11

Se questo errore "impossibile aggiornare ref locale" si ripresenta, anche dopo aver applicato la risposta di Vojtech Vitek o Michel Krämer, è possibile che si abbia un ref errato sul repository AND locale.

In questo caso dovresti applicare entrambe le correzioni senza tirare o spingere tra ...

rm .git/refs/remotes/origin/master
git fetch
git gc --prune=now
git remote prune origin

Una risoluzione permanente per me è stata raggiunta solo dopo aver applicato entrambe le correzioni prima di premere / tirare.


1
Grazie per questo. Si noti che ho sostituito 'master' con il ramo che è stato venendo a mancare per esempio - rm .git / refs / telecomandi / origine / sviluppare
Damien Sawyer

1
Grazie per la tua risposta, davvero aiutato!
naffiq,

1
Questo ha funzionato per me
Jeevan il

10

Per rispondere in breve, questo problema si presenta quando il tuo locale ha alcune informazioni sul telecomando e qualcuno cambia qualcosa che rende remoto e le tue modifiche non sincronizzate.

Stavo riscontrando questo problema perché qualcuno ha eliminato il ramo remoto e creato di nuovo con lo stesso nome.

Per gestire tali problemi, esegui un pull o un recupero dal telecomando.

git remote prune origin

o se stai usando una GUI, esegui un recupero dal telecomando.

inserisci qui la descrizione dell'immagine



3

Prova questo:

git pull origin Branch_Name

Branch_Name, il ramo in cui ti trovi attualmente.

Se fai solo un git pull, estrae anche tutti gli altri nomi di rami creati.

Quindi è la ragione per cui stai ottenendo questo:

! [new branch]      split-css  -> origin/split-css  (unable to update local ref)

2

Per me, avevo un ramo locale chiamato feature/phase2e il ramo remoto è stato nominato feature/phase2/data-model. Il conflitto di denominazione era la causa del problema, quindi ho eliminato il mio ramo locale (potresti rinominarlo se avesse qualcosa che dovevi conservare)


Lo stesso problema qui - il nostro era anche un problema di denominazione dei casi Mac / PC, che ha reso difficile individuare (un nome era in maiuscolo, l'altro no - e ha funzionato sul PC, ma non su Mac)
rocksteady il

2

Se git gc --prune=nownon ti aiuto. (sfortuna come me)

Quello che ho fatto è stato rimuovere il progetto in locale e clonare nuovamente l'intero progetto.


Questo è un approccio "Ho ricevuto un messaggio di errore, quindi ho acquistato un nuovo computer" che non mi aspettavo di ottenere alcun voto su questo sito Web.
Stephan Vierkant,

2

Sto usando Tower e per qualche ragione il mio nome di cartella era .git/refs/remotes/origin/Github. Modificandolo in minuscolo è stato .git/refs/remotes/origin/githubrisolto il problema.


1

Ho avuto lo stesso problema. seguo i seguenti passi

1) cambia il tuo ramo che ha problemi con l'altro ramo

2) cancella quel ramo

3) checkout di nuovo.

Nota: - È possibile nascondere le modifiche non confermate e rimetterle nuovamente.



0

Ho avuto lo stesso problema con l'aggiornamento del compositore. Ma per me ha funzionato solo dopo aver svuotato la cache del compositore e dopo aver eliminato il contenuto della cartella del fornitore:

rm -rf vendor/*
git gc --prune=now
git pull
composer clear-cache
composer update my/package

0

Ho riscontrato questo problema quando provavo a clonare da un git bundlefile creato, nessuna delle altre risposte funzionava perché non potevo clonare il repository (quindi git gcrimuovere / modificare i file era fuori discussione).

Esisteva tuttavia un altro modo per risolvere questo problema: il file di origine di un .bundlefile iniziava con:

# v2 git bundle
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d HEAD
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master
9a3184e2f983ba13cc7f40a820df8dd8cf20b54d refs/heads/master

PACK.......p..x...Kj.0...: (and so on...)

La semplice rimozione della quarta riga con vim ha risolto il problema.


0

Ho riscontrato questo problema durante l'utilizzo di SourceTree. Ho provato a tirare di nuovo e ha funzionato. Penso che stavo ramificando i rami (checkout) troppo velocemente :).

La mia situazione è un po 'diversa da quella del poster perché il mio repository è stato relativamente cooperativo, senza alcuna apparente corruzione.


0
 # remove the reference file of the branch "lost"
 rm -fv ./.git/refs/remotes/origin/feature/v1.6.9-api-token-bot-reader

 # get all the branches from the master
 git fetch --all

 # git will "know" how-to handle the issue from now on
 #     From github.com:futurice/senzoit-www-server
 # * [new branch]      feature/v1.6.9-api-token-bot-reader ->
 # origin/feature/v1.6.9-api-token-bot-reader

 # and push your local changes
 git push

0

Si è verificato lo stesso problema quando il repository è stato eliminato e creato con lo stesso nome. Ha funzionato solo quando ho reimpostato l'URL remoto come di seguito;

git origine set-url remota [GIT_REPO_URL]

Verifica l'URL remoto:

git remote -v

Ora, tutti i comandi dovrebbero funzionare come al solito.


0

Ho appena incontrato il problema oggi.

Metodo di risoluzione dei problemi: con SourceTree su server Windows, puoi provare a eseguirlo come amministratore. Ciò risolve il mio problema di "impossibile aggiornare ref locale" su Atlassian Source Tree 2.1.2.5 su un Windows Server 2012 R2 nel dominio.

Se è possibile replicare troppo questa situazione, si dimostra che il problema è causato da un problema di autorizzazione. È meglio approfondire e trovare la causa principale - probabilmente alcuni file particolari sono di proprietà di altri utenti e simili - altrimenti c'è un effetto collaterale indesiderato: dovrai eseguire SourceTree come amministratore per il resto dell'eternità.


Bene, non lo consiglierei. Ti ritroverai con ancora più file con autorizzazioni errate. E dovrai eseguire tutto ciò che manipola con i file del repository come amministratore. Non è meglio semplicemente correggere le autorizzazioni in primo luogo?
David Ferenczy Rogožan,

Hai ragione. Ma solo dopo averlo fatto funzionare come amministratore avevo capito che era un problema di autorizzazione. Quindi questo è stato un passo nella mia procedura di diagnosi, non una soluzione perfetta di per sé.
Lionet Chen,

Sicuro. Ma molti utenti possono semplicemente prendere la tua risposta come soluzione senza conoscere veramente le conseguenze. Forse meglio se aggiungi la correzione delle autorizzazioni come soluzione suggerita.
David Ferenczy Rogožan,

0

Annotare un caso specifico che potrebbe causare questo problema.

Un giorno ho spinto un ramo chiamato "feature / subfeature", mentre avevo il ramo "feature" sul telecomando.

Quell'operazione ha funzionato bene senza alcun errore da parte mia, ma quando i miei colleghi hanno recuperato e / o tirato qualsiasi ramo, avevano tutti lo stesso identico messaggio di errore unable to update local ref,cannot lock ref 'refs/remotes/origin/feature/subfeature .

Ciò è stato risolto eliminando la featurefiliale su remote ( git push --delete origin feature) e quindi eseguendo git remote prune originil repository dei miei colleghi, che ha generato messaggi tra cui* [pruned] origin/feature .

Quindi, suppongo che git fetchstavo provando a creare subfeatureref in featurecartella su git internamente (.git / ...), ma la creazione della cartella non è riuscita perché c'era featuregià ref.


0

Abbiamo riscontrato questo problema quando uno sviluppatore su Mac ha creato un ramo con un simbolo maggiore di ">" nel nome del ramo.

Ciò ha causato problemi in TeamCity e nei computer locali basati su Windows che eseguono SourceTree. BitBucket l'ha fatto passare senza problemi.

Per risolvere l'utente, il ramo è stato rimosso e ricreato. È stato bello e facile.


-1

Aveva lo stesso messaggio ma con una directory, ho ricevuto un messaggio non riuscito al pull.

git --prone non mi ha aiutato neanche. Si scopre che c'era un file con lo stesso nome di una directory creata da remoto.

Ho dovuto andare su .git \ logs \ refs \ remotes \ origin e cancellare il file locale - quindi tirare di nuovo, tutto bene.

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.