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:password@git.bettercodes.org/myproject/info/
error: cannot lock existing info/refs
fatal: git-http-push failed

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


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.


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


¿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 git@server-address.org:account-name/repo-name.git (fetch)
 origin git@server-address.org: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 git@server-address.org:account-name/repo-name.git


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ó.


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.


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>

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

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
    

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

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.


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.


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.



1

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


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.


1

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


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

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.


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
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.