Error al purgar el archivo del repositorio de Git, no se puede crear una nueva copia de seguridad

116

Intenté eliminar un archivo de mi repositorio remoto ejecutando:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

Pero Git se queja de que

No se puede crear una nueva copia de seguridad. Ya existe una copia de seguridad anterior en refs / original /
Forzar la sobrescritura de la copia de seguridad con -f
rm: no se puede eliminar /.git-rewrite/backup-refs: Permiso denegado
rm: no se puede eliminar el directorio /.git-rewrite: El directorio no está vacío

Esto fue después de que ya borré el directorio .git-rewrite en Windows.

¿Cómo puedo eliminar ese archivo? Es un archivo de 29 Mb que se encuentra en mi repositorio, por lo que necesito eliminar el archivo.

Intenté eliminar la confirmación git rebase -i, pero aparentemente debido a que la confirmación tocó muchos archivos diferentes, Git se queja de los conflictos y aborté para estar seguro.

Cardin
fuente
1
Para motores de búsqueda: esto también puede aplicarse cuando su mensaje de error es .git-rewrite already exists, please remove it.
Drew Noakes

Respuestas:

219

Ya ha realizado una operación de rama de filtro. Después de la rama de filtro, Git mantiene las referencias a las confirmaciones anteriores, en caso de que algo salga mal.

Puedes encontrarlos en .git/refs/original/…. Elimina ese directorio y todos los archivos que contiene, o usa la -fbandera para obligar a Git a eliminar las referencias antiguas.

git filter-branch -f \
--index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD
Knittl
fuente
10
Finalmente lo puse a funcionar, ¡gracias! Probé la bandera -f, pero el problema era que la estaba poniendo al final del comando, por ejemplo. CABEZA -f. Ver tu orden me hizo intentar poner la bandera al principio, ¡y funcionó! = D
Cardin
12
opciones banderas ( -f) van antes de las refs ( HEAD). los
refs
Sigo recibiendo el mismo error después de agregar -f Y eliminar el directorio. ¿Algunas ideas?
Yaron
1
@knittl, no me refería git add. Recibí el mismo error que el póster original incluso después de eliminar la .git/refs/original/carpeta y usar la -fbandera en el git filter-branchcomando. La solución, en mi caso, fue borrar el .git/packed-refsarchivo.
Yaron
1
@knittl, encontré cómo solucionarlo, pero no encontré cuál era el problema. Básicamente, agregué --ignore-unmatchal comando git rmy fue sin problemas.
Gabrielius
21

Utilice este comando para eliminar la copia de seguridad original:

git update-ref -d refs/original/refs/heads/master

Aquí está la esencia que solía filtrar y ramificar mi repositorio git: https://gist.github.com/k06a/25a0214c98bc19fd6817

k06a
fuente
¡Esta es la solución adecuada para eliminar la copia de seguridad! Eliminar .git/refs/original/no resuelve el problema.
Erik Koopmans
Asegúrese de cambiar 'maestro' a la rama que está intentando arreglar ... en mi caso 'desarrollar'
Damian Green
git show-ref | awk '/ refs.original.refs/{print$2}'para encontrar todas las copias de seguridad que tiene su repositorio.
Dan
4

Tuve el mismo problema y la respuesta anterior no lo solucionó. No quedaba ningún directorio .git / refs / original /. La solución para mí fue eliminar el archivo .git / pack-refs.

Yaron
fuente
El mismo problema. Sin .git/packed-refsembargo, no hay archivo ni carpeta originalen .git/refs. ¿Nadie?
XedinUnknown
Resuelto aquí agregando la -rbandera al comando.
XedinUnknown
El mismo problema aqui. Eliminar las referencias empaquetadas resolvió el problema, pero también arruinó el resto de mi directorio git y tuve que restaurar desde la copia de seguridad.
Kevin Yin
2

Agregue una fuerza al comando de rama de filtro.

Adam Dymitruk
fuente