error de git: todavía hay registros debajo

5 minutos de lectura

estoy tratando de usar git fetch --all pero me da errores al buscar un determinado repositorio.

error: todavía hay registros en ‘.git/logs/refs/remotes/tpickel/RS’

y

! [new branch] RS -> tpickel/RS (no se puede actualizar la referencia local)

¿Qué salió mal y cómo solucionarlo?

error de Git

avatar de usuario
Torek

Al parecer, solía haber un tpickel/RS/foo (por algún nombre foo).

Tu Git registró información sobre eso, en .git/logs/refs/remotes/tpickel/RS/foo. Ahora tu Git está intentando crear un archivo llamado .git/logs/refs/remotes/tpickel/RSque registrará información sobre la nueva sucursal tpickel/RS. No puede hacerlo porque hay un directorio, .git/logs/refs/remotes/tpickel/RS, en la forma. El directorio en el camino contiene algún archivo (fooo algún otro nombre, no hay nada arriba que muestre cuál es el nombre real), que es cómo su Git mantenía un registro de referencia para tpickel/RS/foo.

Ahora esa sucursal remota tpickel/RS se ha ido, su Git necesita eliminar ambos refs/remotes/tpickel/RS/foo y su archivo reflog. Idealmente, git fetch --prune tpickel hará ambas cosas a la vez por ti, antes de tratando de crear también tpickel/RS y su reflog, que es lo que está fallando debido a la persistencia tpickel/RS/foo.

Si el --prune funciona, ya está. Si no, tendrás que ir a .git/logs/refs/remotes/tpickel/ y eliminar todos los RS y RS/* entradas, o cámbieles el nombre para que no estorben. (Si desea guardarlos, a pesar del control remoto tpickel después de haber dejado caer la rama, muévelos en lugar de borrarlos, y no dejes que git fetch --prune borra los. Sin embargo, probablemente no quieras guardarlos).

Qué --prune medio

cuando corres git fetch remote (como git fetch tpickel), Git se pone en contacto con el nombre remote y obtiene de él una lista de todas sus referencias. Puede ver esta lista usted mismo en cualquier momento ejecutando git ls-remote remote: esto invoca el mismo inicio pero luego se detiene después de obtener la lista, en lugar de continuar con la búsqueda.

Supongamos que (como es el caso predeterminado normal) se le indica a su Git que copie todas sus referencias de sucursales a sucursales de seguimiento remoto. En este ejemplo particular, eso significaría copiar refs/heads/master a refs/remotes/tpickel/master, por ejemplo. Este tipo de copia es generalmente aditiva: si es remota tpickel tiene sucursales master y develop hoy, y mañana se suman featuretendrá dos sucursales de seguimiento remoto hoy y agregará una nueva mañana cuando obtenga su feature. En algún momento, sin embargo, pueden retirar una rama. ¿Qué pasa si se quitan feature cuando todavía estás usando refs/remotes/tpickel/feature?

La respuesta de Git a este rompecabezas es, por defecto, mantener cualquier referencia copiada para siempre. Como acaba de ver, esto a veces puede obstaculizar las nuevas sucursales después de que se hayan eliminado las viejas, por lo que esta solución no es del todo perfecta. que suma --prune lo que hace es tomar la lista completa, compararla con su conjunto de sucursales de seguimiento remoto y Eliminar desde su repositorio local cualquier rama de seguimiento remoto que no tenga una rama correspondiente en el control remoto. Es decir, solo porque habíamos copiado sus refs/heads/develop a nuestro refs/remotes/tpickel/develop ayer, no significa que debamos mantener refs/remotes/tpickel/develop hoy, si sus refs/heads/develop se ha ido. Así que si especificas --pruneGit busca tales ocurrencias y elimina cualquier rama de seguimiento remoto obsoleta.

Este código ha existido por un tiempo (desde 1.7 más o menos, creo). La versión 1.8.5 de Git agregó dos elementos de configuración: fetch.prune y remote.remote.prune (p.ej, remote.tpickel.prune). Si fetch.prune se establece en true, git fetch siempre ciruelas pasas; si la configuración del control remoto específico está establecida en true, git fetch poda ese control remoto específico.

(El código se mejoró un poco en la versión 2.0.0 de Git para manejar posibles asignaciones ambiguas. Esto cubre los casos en los que múltiples referencias ascendentes pueden asignarse potencialmente a la misma referencia de seguimiento remoto. Con configuraciones normales, esto nunca sucede: solo puede ocurrir si te inventas el tuyo fetch entradas para algún control remoto con nombre).

  • --prune no funcionó, tuve que eliminarlo manualmente. gracias por la ayuda. tal vez quieras dar o vincular una explicación de lo que prune hace exactamente

    – InsOp

    17 mayo 2016 a las 11:51

  • Es interesante que el git fetch --prune ha fallado. Demasiado tarde ahora, pero hubiera sido aún más interesante probar git remote update --prune tpickel y ver si que funcionó, y qué versión de Git tiene: según se informa, algunas versiones tienen algunos errores en los que uno funciona y el otro no.

    – torek

    17 mayo 2016 a las 16:33

Ejecutar “rm -rf .git/logs” resolvió mi problema.

  • Tenga en cuenta que si prueba esta solución, todos sus cambios ocultos desaparecerán

    – Serguéi Ryabov

    6 de febrero de 2019 a las 9:34

  • Nota personal: “¡Lee también los comentarios importantes!”. ;(

    – MiKr13

    7 de abril de 2021 a las 6:03

  • Si quiere estar seguro, simplemente vaya a la carpeta .git y cambie el nombre de la carpeta de registros.

    – Manohar

    10 de agosto a las 12:24

Tuve un problema similar, eliminando .git/logs/refs/remotes/tpickel/RS/foo lo resolvió

  • Sí, excepto que me puse más a la defensiva y simplemente cambié el nombre de la carpeta.

    – Javo

    18 de febrero a las 13:11

Esto resolvió mi problema

git remote prune origin

¿Ha sido útil esta solución?