Git y desagradable "error: no se puede bloquear la información existente / referencias fatales"

361

Después de clonar desde el repositorio remoto de git (en bettercodes) hice algunos cambios, me comprometí e intenté presionar:

git push origin master

Errores con:

error: no se puede bloquear la información / referencias existentes
fatal: error de git-http-push

Este caso se refiere al repositorio ya existente.

Lo que hice antes fue:

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

En 'bettercodes' no tengo acceso a git log.

Estoy usando Windows El error detallado fue:

C:\MyWorkStuff\Projects\Ruby\MyProject\>git push origin master
Unable to create branch path https://user:[email protected]/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed

Cloné antes, luego cambié el código y me comprometí.

AnnD
fuente
Sin suerte, el mismo error nuevamente.
AnnD
Dos posibles razones: a) Se está ejecutando otra instancia de git (elimine todos los procesos de git o reinicie) b) Se creó la carpeta .git como Administrador (intente la línea de comando del administrador para la operación)
FractalSpace
Para mí, resolví el error llamando git fetchantes git pull.
Levi Fuller
1
Ese error desagradable
RobW

Respuestas:

688

Para mí esto funcionó:

git remote prune origin

Como esta respuesta parece ayudar a mucha gente, profundicé un poco en lo que realmente sucede aquí. Lo que esto hará es eliminar las referencias a ramas remotas en la carpeta .git/refs/remotes/origin. Por lo tanto, esto no afectará a sus sucursales locales y no cambiará nada remoto, pero actualizará las referencias locales que tiene a las sucursales remotas. Parece que en algunos casos estas referencias pueden contener datos que Git no puede manejar correctamente.

arno_v
fuente
1
He agregado información de fondo, pero honestamente debo decir que no sé exactamente por qué y cómo funciona :)
arno_v
1
El origen remoto de ciruela git funciona para mí. Pero he eliminado toda la referencia en .git / refs / remotes / origin.
Isuru Madusanka
2
Esto es exactamente lo que gitsugiere hacer, pero era reacio a hacerlo porque el comando parece que hace algo al control remoto.
Deseche la cuenta del
44
Corrígit gc --prune=now
Stanley Mohlala
99
Este es el cmd MÁS MÁS ESCASO que he ejecutado en mucho tiempo. (PD: funcionó)
Sábado Thiru
456

Quieres intentar hacer:

git gc --prune=now

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

kiran.gilvaz
fuente
¿Es --prune = ahora lo mismo que --prune = all? Si es así, la documentación advierte que puede perder objetos no anclados. Si hay objetos no anclados, probablemente debería intentar conciliarlos antes de podarlos.
Assaf Israel
3
Salvavidas, gracias. git pullestaba atascado con el mensaje de error similar.
Phil Brubaker
44
Ayudó para la excepción "error de git: no se puede bloquear la referencia" en la búsqueda. ¡Muchas gracias!
Alexander
99
Esto funcionó para mí. Pero luego tuve que seguir ejecutando el mismo comando cada vez que uso un gitcomando que trata con control remoto. git remote prune originresolvió el problema de una vez por todas.
Keyur Golani
me salvó el día! Muchas gracias :)
Abhishek Gautam
188

Esto me sucedió cuando mi git remote (bitbucket.org) cambió su dirección IP. La solución rápida fue eliminar y volver a agregar el control remoto, luego todo funcionó como se esperaba. Si no está familiarizado con cómo eliminar y volver a agregar un control remoto en git, estos son los pasos:

  1. Copie la URL git SSH de su control remoto existente. Puede imprimirlo en la terminal con este comando:

    git remote -v

que imprimirá algo como esto:

 origin [email protected]:account-name/repo-name.git (fetch)
 origin [email protected]:account-name/repo-name.git (push)
  1. Elimine el control remoto de su repositorio local de git:

    git remote rm origin

  2. Agregue el control remoto a su repositorio local:

    git remote add origin [email protected]:account-name/repo-name.git

johnnyclem
fuente
8
He intentado todo lo demás, como git gc, git prune, rm 'file with lock error', git update server info, etc. Solo esta respuesta funcionó para mí. A veces es como reiniciar Windows, reiniciar y funcionará. Lo mismo aquí, simplemente elimine y agregue el repositorio nuevamente, y todo saldrá bien;)
Marquinho Peli
12
Después del procedimiento anterior, también necesitaba decirle a git que rastreara la rama remota nuevamente con, por ejemplo:git branch -u origin/master
fotinsky
Esto destruyó toda mi información de seguimiento remoto en .git / config y en realidad no funcionó.
ThomasMcLeod
Esto funcionó para mí también. Todos los demás no funcionaron.
dondrzzy
42

El comando en ejecución lo git update-ref -d refs/heads/origin/brancharregló.

akansh tayal
fuente
44
Ese comando hizo el truco para mí también, aunque mi ref rama remota era ligeramente diferente:git update-ref -d refs/remotes/origin/my_branch
ndeslandes
Esto funcionó para mí, parece que este fue un problema de mayúsculas y minúsculas. Hubo dos ramas con el mismo nombre que fueron empujadas al origen por otro usuario de git, una tenía minúsculas y otra era el caso del título.
th3uiguy
24

Lo arreglé haciendo lo siguiente

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

Esto supone que sus ramas locales y remotas están alineadas y que solo obtiene el error de referencia como no fatal.

FrankMonza
fuente
12

Tuve este problema porque estaba en una sucursal que tenía un nombre similar a una sucursal aguas arriba. es decir, se llamó a la rama aguas arriba y se llamó a example-branchmi rama local example-branch/backend. La solución fue cambiar el nombre de mi sucursal local de la siguiente manera:

git branch -m <new name goes here>
George Armstrong
fuente
12

Lo que funcionó para mí fue:

  1. Eliminar .git/logs/refs/remotes/origin/branch
  2. Eliminar .git/refs/remotes/origin/branch
  3. correr git gc --prune=now
emirc
fuente
1
Trabajado como un encanto. Si alguien se enfrenta a un problema con la rama del nombre de archivo / carpeta, en realidad se refiere a todos los archivos / carpetas de nombre de rama. ¡Espero que esto ayude!
Ankit Kesharwani
11

Esto probablemente ya se haya resuelto. Pero aquí está lo que funcionó para mí.

  1. Ubicación:

    • Si el repositorio bloqueado está en el lado del servidor:

      1. ssh a su repositorio git en el servidor.
      2. Inicie sesión como usuario que tiene permisos para modificar el repositorio y navegue hasta el repositorio en su servidor.
    • Si el repositorio bloqueado es solo local:

      1. Abra la consola de git y navegue al directorio del repositorio.
      2. Ejecute este comando:

        git update-server-info
        
  2. Arregle los permisos en su repositorio (remoto o local) si es necesario. En mi caso tuve que chmodir 777y chownvenirapache:apache

  3. Intente presionar nuevamente desde el repositorio local:

    git push
    
Cola de lobo
fuente
7

Así es como funciona para mí.

  1. busque el archivo de bloqueo DAV de Apache en su servidor (por ejemplo, / var / lock / apache2 / DAVlock)
  2. bórralo
  3. recrearlo con permisos de escritura para el servidor web
  4. reiniciar el servidor web

Alternativa aún más rápida:

  1. busque el archivo de bloqueo DAV de Apache en su servidor (por ejemplo, / var / lock / apache2 / DAVlock)
  2. Vaciar el archivo: cat /dev/null > /var/lock/apache2/DAVlock
  3. reiniciar el servidor web
Schmunk
fuente
Este fue mi problema. Gracias por la publicacion. Ejecuté la eliminación y los permisos de una sola vez. #> rm DAVLock; touch DAVLock; chown www-data.www-data DAVLock; chmod 755 DAVLock; service apache2 restart
djneely
6

Esto suena como un problema de permisos: ¿es posible que haya abierto dos ventanas que se ejecutan con derechos separados? Quizás verifique la propiedad de la carpeta .git.

Tal vez verifique si hay un bloqueo de archivo pendiente abierto, tal vez use lsof para verificar, o el equivalente para su sistema operativo.

Josh
fuente
3

En mi caso, una rama se movió a un subdirectorio y el directorio se llamó como la rama. Git estaba confundido por eso. Cuando eliminé la sucursal local (en SourceTree solo con hacer clic derecho en eliminar) todo funcionó como de costumbre.

CodingYourLife
fuente
3

En mi caso, después de recibir este mensaje, hice el comando de pago y recibí este mensaje:

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

Después de ejecutar este comando, volví a la normalidad.

Colin
fuente
2

Actualizar:

Es posible que deba editar su archivo ~ / .netrc:

https://bugs.launchpad.net/ubuntu/+source/git-core/+bug/293553

Respuesta original:

¿Por qué deshabilitó ssl? Creo que esto podría tener que ver con que no puedas presionar a través de https. Volvería a configurarlo e intentaría presionar de nuevo:

git config –global http.sslVerify true
ralphtheninja
fuente
1

Compruebe que usted (proceso git en realidad) tenga acceso al archivo .git/info/refsy que este archivo no esté bloqueado por otro proceso.

Ivan Danilov
fuente
2
¿Cómo se verifica eso?
Iulian Onofrei
1

Tuve este problema cuando intentaba crear una nueva rama de características que contuviera el nombre de la rama anterior, por ejemplo, origin - branch1 y quería crear una característica branch1. No era posible, pero branch1 / feature ya lo era.

usuario11464384
fuente
1

En mi caso, tuve que eliminar manualmente las etiquetas antiguas que se habían eliminado en el control remoto.

joliejuly
fuente
1

En mi caso, estaba conectado con el nombre de la sucursal que ya había creado.

Para solucionar el problema, he creado una rama con el nombre que con seguridad no debería existir, como:

git checkout -b some_unknown_branch

Luego, borré todas mis otras ramas (no activas) porque eran basura innecesaria.

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

y luego cambié el nombre de mi sucursal actual con el nombre que pretendía, como:

git checkout -m my_desired_branch_name
Arsen Khachaturyan
fuente
0

En el caso de bettercodes.org, la solución es más poética: el único problema puede estar en los derechos asignados a los miembros del proyecto. ¡Los miembros simples no tienen derechos de escritura! Asegúrese de tener los derechos de moderador o administrador. Esto debe ser configurado en bettercodes.org en la configuración del proyecto por un administrador, por supuesto.

yman
fuente
0

Vi este error al intentar ejecutar git filter-branchpara separar muchos subdirectorios en un nuevo repositorio separado (como en esta respuesta ).

Probé todas las soluciones anteriores y ninguna funcionó. Finalmente, decidí que no necesitaba conservar mis etiquetas tan mal en la nueva rama y simplemente ejecuté:

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
tessafyi
fuente