git pull falla "no se puede resolver la referencia" "no se puede actualizar la referencia local"


606

Usando git 1.6.4.2, cuando probé un git pullme sale este error:

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)

Lo intenté git remote prune origin, pero no ayudó.


Respuestas:


929

Intente limpiar su repositorio local con:

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

hombre 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
¿Por qué funciona esto? ¿Cuál es el problema que soluciona?
Ikke

55
El segundo comando funcionó para mí. Al parecer, tenía una referencia rota a una rama remota que acaba de crear. No estoy seguro de cómo sucedió, pero me alegro de que fuera una solución simple. Gracias vitek!
JGTaylor

1
Esto funcionó perfectamente! También me encantaría una explicación de lo que esto hace y por qué funcionó. ¡Gracias!
ArielSD

44
¿Se git remote prune originejecutará el comando en mi copia de trabajo local o en el repositorio remoto?
user1438038

3
@ user1438038 No debe eliminar ninguna rama y solo actualizar las referencias remotas en su copia de trabajo local. Más información aquí: stackoverflow.com/questions/20106712/…
Zengineer

606

Me pasó a mí también. En mi caso, el árbitro malo era maestro e hice lo siguiente:

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

Esto hizo que git restaurara el archivo de referencia. Después de eso, todo volvió a funcionar como se esperaba.


1
Hice lo mismo y resolvió mi problema. Cuando abrí el archivo en Notepad ++, estaba claramente dañado.
theMayer

83
asegúrese de elegir el archivo que le está dando problemas en lugar de maestro
bia.migueis

66
@ bia.migueis: sin embargo, no va a dañar nada si accidentalmente eliminas al maestro, solo se actualizará la próxima búsqueda también.
naught101

2
Si es un submódulo, puede ser un poco difícil encontrar la referencia. Primero verifique si se .gittrata de una carpeta; de lo ls -lacontrario, consulte el contenido del .gitarchivo para encontrar la carpeta .git real en la que se encuentran las referencias. .gitcontenido del archivo en mi caso: gitdir: ../.git/modules/my-submodule-name
CCoder

1
Dos veces en el último año he vuelto para tener que arreglar esto y nuevamente, esta es la única solución que realmente funciona.
Ted

131

Esto hizo el trabajo para mí:

git gc --prune=now

55
Esto funcionó. ¡Gracias por salvarme el día! @Bernd ¿Alguna explicación posible del comando?
nashcheez

los documentos de git gc están aquí
BigRon

1
A mí también me funcionó. No necesitaba corrergit remote prune origin
Airwavezx

87

Para mí, funcionó para eliminar los archivos que arrojan errores de la carpeta .git/refs/remotes/origin/.


eso lo hizo! Pero solo por curiosidad, ¿sabes por qué se produjo este error? (Todo funcionaba bien y, de repente, un día apareció este error). ¿Y también sabes cómo eliminarlo solucionó el archivo?
Shreyans

Es bueno escuchar que esto también lo arregló para ti. Para ser sincero, no tengo idea de qué causó la aparición del error. Pensé que uno de los archivos de la carpeta no estaba sincronizado. Como ninguna de las otras soluciones que encontré funcionó para mí, utilicé esto como último recurso.
Brian van Rooijen

Funcionó genial! Observe que tiene que eliminar todos los archivos que causan el problema (según el informe de error que está recibiendo), como si solo eliminara uno e intente recuperarlo.
Rayee Roded

1
Una de las posibles causas puede ser el bloqueo del sistema como describí en mi respuesta . Muchas aplicaciones de la GUI de Git ejecutan periódicamente Git en su repositorio (para actualizar el estado) y si su sistema falla durante la manipulación de Git con las referencias, pueden terminar reescritas con NULLs.
David Ferenczy Rogožan

53

Intentalo:

git gc --prune=now

git remote prune origin

git pull

26
Si bien esto podría responder a la pregunta de los autores, carece de algunas palabras explicativas y / o enlaces a la documentación. Los fragmentos de código sin formato no son muy útiles sin algunas frases a su alrededor. También puede encontrar cómo escribir una buena respuesta muy útil. Por favor edite su respuesta.
Roy Scheffers el

Exactamente el punto. No es suficiente corregir el código y eso es todo. Espero que haya una explicación
Musikero31

1
git gc --prune = ahora actualiza el repositorio local mientras elimina archivos innecesarios. A mí me funciona bien.
Vasyl Gutnyk

45

Ejecute los siguientes comandos:

rm .git/refs/remotes/origin/master

git fetch

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

Por si acaso, si necesita saber qué es .git/refs/remotes/origin/master, debería leer la sección Remotos en Referencias de Git .


1
¿Puedes explicar qué es .git / refs / remotes / origin / branchName? Esta solución funcionó para mí
caitcoo0odes

44

Solo me gustaría agregar cómo puede suceder que se rompa una referencia.

Posible causa raíz

En mi sistema (Windows 7 de 64 bits), cuando ocurre un BSOD , algunos de los archivos de referencia almacenados (probablemente abiertos / grabados actualmente cuando ocurrió BSOD) se sobrescriben conNULL caracteres (ASCII 0).

Como otros mencionaron, para solucionarlo, es suficiente simplemente eliminar esos archivos de referencia no válidos y volver a buscar o volver a extraer el repositorio.

Ejemplo

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

Solución: elimine el archivo%repo_root%/.git/refs/remotes/origin/some/branch


1
El mismo escenario en Windows 10 de 64 bits: trabajando en un repositorio git cuando ocurre BSOD. error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken. Intentando git pulldespués de eliminar el primer archivo devuelto fatal: update_ref failed for ref 'HEAD': cannot lock ref 'HEAD': unable to resolve reference 'refs/heads/master': reference broken. Después de eliminar el segundo archivo git pull origin masterfue exitoso.
cjmcdonn

39

Tuve este mismo problema y lo resolví yendo al archivo en el que estaba produciendo el error:

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

Este archivo estaba lleno de nulos, lo reemplacé con la última referencia de github.


2
Tuve el mismo problema, pero el archivo .git/refs/remotes/origin/masterestaba vacío. Resolvió el problema eliminándolo.
zinovyev

38

En mi caso, el problema se resolvió después de eliminar todos los archivos de referencia de eliminación del directorio .git.

Si mira el mensaje, le dirá qué archivos necesita eliminar (específicamente).

Los archivos para eliminar se encuentran debajo .git/refs/remotes.

Acabo de eliminar todos los archivos allí y ejecuté gc prune

git gc --prune=now

Después de eso, todo funciona bien.


En mi caso, simplemente elimino .git / refs / remotes y luego actualizo y presiono sobre el servidor y funcionó.
Faraz Ahmed

Gracias Uri En mi caso, simplemente eliminé archivos bajo referencias / controles remotos / origen / función y simplemente lo hice - git pull
Deepboy

26

Explicación : Parece que sus ramas remotas de repositorio (en Github / bitbucket) se eliminaron, aunque sus referencias locales no se actualizaron y apuntan a referencias inexistentes.

Para resolver este problema:

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

Para lectura adicional - Referencia de la documentación de Github :

git-fetch - Descarga objetos y referencias de otro repositorio

--todos todos los controles remotos.

--prune Después de buscar, elimine las ramas de seguimiento remoto que ya no existen en el control remoto.


1
Esto funcionó para mí
Onengiye Richard

1
Gracias, funcionó para mí.
Sam

17

git fetch --prune solucionó este error para mí:

[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

Sin embargo, esto supone que la rama infractora se eliminó en el control remoto.


Su ejemplo parece incompleto: no muestra lo --pruneque puedo ver. También consejo: elimine los mensajes de contraseña inútiles después de pegar ejemplos.
MarkHu

Tienes toda la razón: dejé el resultado del comando fetch pero solo lo puse en el ejemplo. ¡Gracias por el consejo de eliminar la solicitud de contraseña también!
marczych

11

Si este error "no se puede actualizar la referencia local" se repite, incluso después de aplicar la respuesta de Vojtech Vitek o Michel Krämer es posible que tenga una referencia incorrecta en su repositorio local Y maestro.

En este caso, debe aplicar ambas correcciones sin tirar o empujar entre ...

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

Una resolución permanente para mí solo se logró después de aplicar ambas correcciones antes de empujar / tirar.


1
Gracias por esto. tenga en cuenta que reemplacé 'master' con la rama que estaba fallando, por ejemplo - rm .git / refs / remotes / origin / desarrollo
Damien Sawyer

1
Gracias por tu respuesta, realmente ayudó!
naffiq

1
Esto funcionó para mí
porJeevan

10

Para responder esto en breve, este problema se produce cuando su local tiene información sobre el control remoto y alguien cambia algo que hace que el control remoto y sus cambios no estén sincronizados.

Estaba recibiendo este problema porque alguien eliminó la rama remota y nuevamente creó con el mismo nombre.

Para lidiar con tales problemas, realice una extracción o recuperación desde el control remoto.

git remote prune origin

o si está utilizando alguna GUI, realice una búsqueda desde el control remoto.

ingrese la descripción de la imagen aquí



3

Prueba esto:

git pull origin Branch_Name

Branch_Name, la rama en la que se encuentra actualmente.

Si solo hace una git pull, también extrae todos los demás nombres de sucursal creados.

Entonces, es la razón por la que obtienes esto:

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

2

Para mí, tenía una rama local llamada feature/phase2y la rama remota se llamaba feature/phase2/data-model. El conflicto de nombres fue la causa del problema, por lo que eliminé mi sucursal local (podría cambiarle el nombre si tuviera algo que necesitara conservar)


La misma cuestión aquí - la nuestra era también un problema de Mac / PC-caso nombrar, lo que hacía difícil de detectar (un nombre fue capitalizado, el otro no - y funcionó en el PC, pero no Mac)
rocksteady

2

Si git gc --prune=nowno te ayuda. (mala suerte como yo)

Lo que hice fue eliminar el proyecto en local y volver a clonar todo el proyecto nuevamente.


Este es un enfoque de "Recibí un mensaje de error, así que compré una computadora nueva", que no esperaba recibir votos positivos en este sitio web.
Stephan Vierkant

2

Estoy usando Tower y, por alguna razón, el nombre de mi carpeta era .git/refs/remotes/origin/Github. Cambiarlo a minúsculas .git/refs/remotes/origin/githubresolvió el problema.


1

Tuve el mismo problema sigo los siguientes pasos

1) cambie su rama que tiene problemas a otra rama

2) eliminar esa rama

3) pago nuevamente.

Nota: - Puede guardar los cambios no confirmados y volver a guardarlos.



0

Tuve el mismo problema con la actualización del compositor. Pero para mí solo funcionó después de borrar el caché del compositor y después de eliminar el contenido de la carpeta del proveedor:

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

0

Tengo este problema al intentar clonar desde un git bundlearchivo creado, ninguna de las otras respuestas funcionó porque no pude clonar el repositorio (entoncesgit gc eliminar y editar archivos estaba fuera de discusión).

Sin embargo, había otra forma de solucionar esto: el archivo fuente de un .bundlearchivo comenzaba con:

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

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

Simplemente eliminar la cuarta línea con vim solucionó el problema.


0

Tuve este problema al usar SourceTree. Traté de tirar de nuevo y funcionó. Creo que estaba brujando ramas (pago) demasiado rápido :).

Mi situación es un poco diferente a la del póster porque mi repositorio ha sido relativamente cooperativo, sin ninguna corrupción aparente.


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

Enfrenté el mismo problema cuando el repositorio fue eliminado y creado con el mismo nombre. Funcionó solo cuando restablecí la url remota como a continuación;

origen de set-url remoto de git [GIT_REPO_URL]

Verifique la URL remota:

git remote -v

Ahora, todos los comandos deberían funcionar como de costumbre.


0

Acabo de encontrarme con el problema hoy.

Método de solución de problemas: con SourceTree en los servidores de Windows, puede intentar ejecutarlo como administrador. Eso soluciona mi problema de "no se puede actualizar la referencia local" en Atlassian Source Tree 2.1.2.5 en un Windows Server 2012 R2 en el dominio.

Si también puede replicar esta situación, demuestra que el problema es causado por un problema de permiso. Es mejor profundizar y encontrar la causa raíz, probablemente algunos archivos particulares son propiedad de otros usuarios y demás; de lo contrario, hay un efecto secundario no deseado: tendrá que ejecutar SourceTree como Administrador por el resto de la eternidad.


Bueno, no recomendaría esto. Terminará con aún más archivos con permisos incorrectos. Y necesitará ejecutar todo lo que manipula con archivos de repositorio como administrador. ¿No es mejor simplemente arreglar los permisos en primer lugar?
David Ferenczy Rogožan

Tienes razón. Pero solo después de hacerlo funcionar como administrador, me di cuenta de que era el problema del permiso. Así que este fue un paso en mi procedimiento de diagnóstico, no una solución perfecta per se.
Lionet Chen

Por supuesto. Pero muchos usuarios pueden simplemente tomar su respuesta como una solución sin saber realmente las consecuencias. Tal vez sea mejor si agrega la fijación de los permisos como una solución sugerida.
David Ferenczy Rogožan

0

Escribir un caso específico que pueda causar este problema.

Un día empujé una rama llamada "característica / subfunción", mientras tenía una rama "característica" en el control remoto.

Esa operación funcionó bien sin ningún error de mi parte, pero cuando mis compañeros de trabajo fue a buscar y / o tirar cualquier rama, todos ellos tenían el mismo mensaje de error exacto unable to update local ref, cannot lock ref 'refs/remotes/origin/feature/subfeature.

Esto se resolvió eliminando la featuresucursal en remote ( git push --delete origin feature) y luego ejecutándola git remote prune originen el repositorio de mis compañeros de trabajo, que generó mensajes incluidos * [pruned] origin/feature.

Entonces, supongo que git fetchestaba tratando de crear subfeatureref en la featurecarpeta en git internamente (.git / ...), pero la creación de la carpeta falló porque ya había featureref.


0

Tenemos este problema cuando un desarrollador en Mac creó una rama con un símbolo mayor que ">" en el nombre de la rama.

Eso causó problemas en TeamCity y en las computadoras locales basadas en Windows que ejecutan SourceTree. BitBucket lo dejó pasar sin ningún problema.

Para resolverlo, el usuario eliminó la rama y la recreó. Lo cual fue agradable y fácil.


-1

Tenía el mismo mensaje pero con un directorio, recibí un mensaje fallido al extraer.

git --prone tampoco me ayudó. Resulta que había un archivo con el mismo nombre que un directorio creado de forma remota.

Tuve que ir a .git \ logs \ refs \ remotes \ origin y borrar el archivo de configuración regional, y luego volver a tirar, todo bien.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.