Git and sgradevole "errore: impossibile bloccare informazioni esistenti / riferimenti fatali"


361

Dopo aver clonato dal repository git remoto (su bettercodes) ho apportato alcune modifiche, mi sono impegnato e ho provato a spingere:

git push origin master

Errori con:

errore: impossibile bloccare le informazioni / i riferimenti esistenti
fatale: git-http-push non riuscito

Questo caso riguarda il repository già esistente.

Quello che ho fatto prima era:

  1. git config –global http.sslVerify false
  2. git init
  3. git remote add [url]
  4. git clone
  5. modifica dei dati
  6. git commit

Su 'bettercodes' non ho accesso al registro git.

Sto usando Windows. L'errore dettagliato era:

C:\MyWorkStuff\Projects\Ruby\MyProject\>git push origin master
Unable to create branch path https://user:password@git.bettercodes.org/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed

Ho clonato prima, quindi modificato il codice e impegnato.


Nessuna fortuna, di nuovo lo stesso errore.
Ann

Due possibili motivi: a) Un'altra istanza di git è in esecuzione (termina tutti i processi git o riavvia) b) La cartella .git è stata creata come amministratore (prova la riga di comando dell'amministratore per l'operazione)
FractalSpace

Per me, ho risolto l'errore chiamando git fetchprima git pull.
Levi Fuller,

Risposte:


686

Per me questo ha funzionato:

git remote prune origin

Dal momento che questa risposta sembra aiutare molte persone, ho scavato un po 'in quello che succede realmente qui. Ciò che farà sarà rimuovere i riferimenti ai rami remoti nella cartella .git/refs/remotes/origin. Quindi questo non influirà sulle filiali locali e non cambierà nulla in remoto, ma aggiornerà i riferimenti locali che hai alle filiali remote. Sembra che in alcuni casi questi riferimenti possano contenere dati che Git non può gestire correttamente.


1
Ho aggiunto alcune informazioni di base, ma devo onestamente dire che non so esattamente perché e come funziona :)
arno_v

1
git remote prune origin funziona per me. Ma ho eliminato tutti i riferimenti in .git / refs / remotes / origin.
Isuru Madusanka,

2
Questo è esattamente ciò che gitsuggerisce di fare, ma ero riluttante a farlo perché il comando sembra fare qualcosa al telecomando.
Getta via l'account

4
Ho corsogit gc --prune=now
Stanley Mohlala il

9
Questo è il gd SCARIEST cmd che ho eseguito da un po '. (PS: ha funzionato)
Sab Thiru

456

Vuoi provare a fare:

git gc --prune=now

Vedi https://www.kernel.org/pub/software/scm/git/docs/git-gc.html


--Prune = ora è uguale a --prune = all? In tal caso, la documentazione avverte che è possibile perdere oggetti non ancorati. Se ci sono oggetti non ancorati, probabilmente dovresti provare a riconciliarli prima della potatura.
Assaf Israel,

3
Salvavita, grazie. git pullera bloccato con un messaggio di errore simile.
Phil Brubaker,

4
Ha aiutato per l'eccezione "errore git: impossibile bloccare ref" al recupero. Molte grazie!
Alexander,

9
Questo ha funzionato per me. Ma poi ho dovuto continuare a eseguire lo stesso comando ogni volta che utilizzo un gitcomando che si occupa del telecomando. git remote prune originrisolto il problema una volta per tutte.
Keyur Golani,

mi ha salvato la giornata! Grazie mille :)
Abhishek Gautam,

188

Questo mi è successo quando il mio telecomando git (bitbucket.org) ha cambiato il loro indirizzo IP. La soluzione rapida era rimuovere e aggiungere nuovamente il telecomando, quindi tutto ha funzionato come previsto. Se non hai familiarità con come rimuovere e aggiungere nuovamente un telecomando in Git, ecco i passaggi:

  1. Copia l'URL git SSH del tuo telecomando esistente. Puoi stamparlo sul terminale usando questo comando:

    git remote -v

che stamperà qualcosa del genere:

 origin git@server-address.org:account-name/repo-name.git (fetch)
 origin git@server-address.org:account-name/repo-name.git (push)
  1. Rimuovere il telecomando dal repository git locale:

    git remote rm origin

  2. Aggiungi il telecomando al repository locale:

    git remote add origin git@server-address.org:account-name/repo-name.git


8
Ho provato tutto il resto, come git gc, git prune, rm 'file con errore di blocco', informazioni sul server di aggiornamento git, ecc. Solo questa risposta ha funzionato per me. A volte è come un riavvio di Windows, riavvio e funzionerà. Lo stesso qui, basta rimuovere e aggiungere nuovamente il repository, e tutto va bene;)
Marquinho Peli,

12
Dopo la procedura di cui sopra, dovevo anche dire a git di rintracciare nuovamente il ramo remoto con ad esempio:git branch -u origin/master
fotinsky

Questo ha spazzato via tutte le mie informazioni di tracciamento remoto in .git / config e non ha funzionato.
ThomasMcLeod,

Questo ha funzionato anche per me. Tutti gli altri non hanno funzionato.
dondrzzy,

42

Il comando in esecuzione git update-ref -d refs/heads/origin/branchlo ha risolto.


4
Questo comando ha funzionato anche per me, anche se il mio riferimento al ramo remoto era leggermente diverso:git update-ref -d refs/remotes/origin/my_branch
ndeslandes

Questo ha funzionato per me, sembra che questo fosse un problema di distinzione tra maiuscole e minuscole. C'erano due rami con lo stesso nome che venivano spinti all'origine da un altro utente git, uno aveva tutti i caratteri minuscoli e uno che era il caso del titolo.
th3uiguy,

24

Ho risolto questo facendo quanto segue

git branch --unset-upstream
rm .git/refs/remotes/origin/{branch}
git gc --prune=now
git branch --set-upstream-to=origin/{branch} {branch}
#or git push --set-upstream origin {branch}
git pull

Ciò presuppone che le filiali locali e remote siano allineate e che si stia ottenendo l'errore refs come non fatale.


12

Ho avuto questo problema perché ero su un ramo che aveva un nome simile a un ramo a monte. cioè fu chiamato il ramo a monte e fu chiamato il example-branchmio ramo locale example-branch/backend. La soluzione stava cambiando il nome della mia filiale locale in questo modo:

git branch -m <new name goes here>

12

Ciò che ha funzionato per me è stato:

  1. Rimuovere .git/logs/refs/remotes/origin/branch
  2. Rimuovere .git/refs/remotes/origin/branch
  3. Correre git gc --prune=now

1
Ha funzionato come un fascino. Se qualcuno si trova ad affrontare un problema con il ramo del nome del file / cartella, si sta effettivamente riferendo a tutti i file / cartelle del nome del ramo. Spero che questo possa essere d'aiuto!
Ankit Kesharwani,

11

Questo è probabilmente risolto ormai. Ma ecco cosa ha funzionato per me.

  1. Posizione:

    • Se il repository bloccato si trova sul lato server:

      1. ssh nel tuo repository git sul server.
      2. Accedere come utente che dispone delle autorizzazioni per modificare il repository e accedere al repository sul proprio server.
    • Se il repository bloccato è solo locale:

      1. Apri la console git e vai alla directory del repository.
      2. Esegui questo comando:

        git update-server-info
        
  2. Se necessario, correggi le autorizzazioni sul tuo repository (remoto o / e locale). Nel mio caso ho dovuto chmoda 777e chownallaapache:apache

  3. Prova a spingere di nuovo dal repository locale:

    git push
    

7

Funziona così per me.

  1. cerca il file di blocco di Apache DAV sul tuo server (ad es. / var / lock / apache2 / DAVlock)
  2. Cancellalo
  3. ricrearlo con le autorizzazioni di scrittura per il server web
  4. riavvia il server web

Un'alternativa ancora più veloce:

  1. cerca il file di blocco di Apache DAV sul tuo server (ad es. / var / lock / apache2 / DAVlock)
  2. Svuota il file: cat /dev/null > /var/lock/apache2/DAVlock
  3. riavvia il server web

Questo era il mio problema. Grazie per il post. Ho eseguito la rimozione e le autorizzazioni tutto in una volta. #> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely

6

Sembra un problema con le autorizzazioni: è possibile che tu abbia aperto due finestre, eseguendo con diritti separati? Forse controlla la proprietà della cartella .git.

Forse controlla per vedere se c'è un blocco file in sospeso aperto, forse usa lsof per verificare o l'equivalente per il tuo sistema operativo.


3

Nel mio caso un ramo è stato spostato in una sottodirectory e la directory è stata chiamata come ramo. Git ne era confuso. Quando ho eliminato il ramo locale (in SourceTree solo con il tasto destro del mouse su Elimina) tutto ha funzionato come al solito.


3

Nel mio caso dopo aver ricevuto questo messaggio ho fatto il comando di checkout e mi è stato dato questo messaggio:

Your branch is based on 'origin/myBranch', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Dopo aver eseguito questo comando sono tornato alla normalità.



1

Verifica che tu (processo git effettivamente) abbia accesso al file .git/info/refse questo file non sia bloccato da un altro processo.


2
Come lo controlli?
Iulian Onofrei,

1

Ho avuto questo problema, quando stavo cercando di creare un nuovo ramo di funzionalità che conteneva il nome del vecchio ramo, ad esempio origine - ramo1 e volevo creare la funzione ramo1. Non era possibile, ma branch1 / feature lo era già.


1

Nel mio caso ho dovuto eliminare manualmente i vecchi tag che erano stati rimossi sul telecomando.


1

Nel mio caso, era collegato al nome del ramo che avevo già creato.

Per risolvere il problema ho creato un ramo con il nome che per certo non dovrebbe esistere, come:

git checkout -b some_unknown_branch

Poi ho cancellato tutti gli altri rami (non attivi) perché erano solo immondizie inutili.

git branch | grep -v \* | grep -v master | xargs git branch -D

e poi rinominato il mio ramo attuale con il nome che ho voluto, come:

git checkout -m my_desired_branch_name

0

Nel caso di bettercodes.org, la soluzione è più poetica: l'unico problema potrebbe essere rappresentato dai diritti assegnati ai membri del progetto. I membri semplici non hanno diritti di scrittura! Assicurati di disporre dei diritti di moderatore o amministratore. Questo deve essere impostato su bettercodes.org alle impostazioni del progetto da un amministratore, ovviamente.


0

Ho visto questo errore durante il tentativo di eseguire il git filter-branchdistacco di molte sottodirectory in un nuovo repository separato (come in questa risposta ).

Ho provato tutte le soluzioni di cui sopra e nessuna di esse ha funzionato. Alla fine, ho deciso che non avevo bisogno di conservare i miei tag così male nel nuovo ramo e ho appena eseguito:

git remote remove origin
git tag | xargs git tag -d
git gc --prune=now
git filter-branch --index-filter 'git rm --cached -qr --ignore-unmatch -- . && git reset -q $GIT_COMMIT -- apps/AAA/ libs/xxx' --prune-empty -- --all
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.