git rm - fatal: pathpec no coincide con ningún archivo

87

Agregué más de 9000 fotos por accidente a la carpeta de mi proyecto. Y los cometió. Luego los borró del disco. Comprometido.

Ahora intento enviar cambios al servidor git. Pero tarda demasiado e intenta enviar 12 Gb de datos.

Verifiqué el tamaño de los archivos en el disco y vi que realmente la .gitcarpeta ocupa 12 Gb.

¿Cómo borrar fotos de ahí? Lo intenté git rm, pero falla:

❯ git rm public/photos
fatal: pathspec 'public/photos' did not match any files

Porque ya los borré del disco, pero todavía están en la .gitcarpeta.

Traté de agregar public/photosa .gitignore:

public/photos/
*.zip

Pero sin resultado. Por supuesto que podría hard reset headhacerlo cuando no tuviera tantas fotos basura en mi proyecto. Pero desde ese momento me comprometí muchas veces e hice muchos cambios en el código.

Maxim Yefremov
fuente

Respuestas:

86

En su caso, utilice en git filter-branchlugar de git rm.

git rm eliminará los archivos en el sentido de que git ya no los rastreará, pero eso no elimina los antiguos objetos de confirmación correspondientes a esas imágenes, por lo que aún tendrá que presionar las confirmaciones anteriores que corresponden a 12 GB de imágenes.

El git filter-branch, por otro lado, también puede eliminar esos archivos de todas las confirmaciones anteriores, eliminando así la necesidad de insertar cualquiera de ellos.

  1. Usa el comando

    git filter-branch --force --index-filter \
      'git rm -r --cached --ignore-unmatch public/photos' \
      --prune-empty --tag-name-filter cat -- --all
    
  2. Una vez completada la rama del filtro, verifique que no se haya perdido ningún archivo no deseado.

  3. Ahora agregue una regla .gitignore

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
  4. Ahora haz un empujón

    git push -f origin branch
    

Compruebe esto , esto y esto para obtener más ayuda. Solo para estar más seguro, le sugiero que cree una copia de seguridad del repositorio en su sistema antes de seguir adelante con estas instrucciones.

En cuanto a su mensaje de error original, está sucediendo porque ya los eliminó usando git rm, y por lo tanto, git se queja porque no puede eliminar un archivo que no está rastreando. Lea más sobre esto aquí .

mu 無
fuente
2
Oye, tengo el mismo problema, pero al escribir el comando en el paso 1, aparece un error: fatal: bad revision '--prune-empty'. ¿Cualquier pista?
Kevin
@kevin lo siento, me perdí este comentario. Puedes ejecutarlo sin esa bandera. La poda habría eliminado cualquier objeto de confirmación vacío.
mu 無
1
En caso de que esta línea no git add .gitignore && commit -m "ignore rule for photos"sergit add .gitignore && git commit -m "ignore rule for photos"
Clone
@Clone sí, debería haber sido eso, lo he corregido ahora :)
mu 無
1
Esta es una respuesta increíblemente asombrosa. Se solucionó un problema que tenía con mi repositorio durante varios años. ¡Gracias!
Moshe
18

Una respuesta muy simple es.

Paso 1:

En primer lugar, agregue los archivos sin seguimiento a los que desea eliminar:

usando git add .o git add <filename>.

Paso 2:

Luego elimínelos fácilmente usando el comando git rm -f <filename>aquí rm = remove y -f = forcely.

Bharti Rawat
fuente
esto no hará lo que quiere el OP, que es eliminar archivos que están presentes en confirmaciones anteriores. Debe usar git filter-branchcomo se menciona en otra parte.
Simon Stevens
9

Paso 1

Agregue los nombres de archivo a su .gitignorearchivo.

Paso 2

git filter-branch --force --index-filter \
    'git rm -r --cached --ignore-unmatch YOURFILE' \
    --prune-empty --tag-name-filter cat -- --all

Paso 3

git push -f origin branch

Muchas gracias a @mu.

klmlfl
fuente
7
... siempre pensé que git era más difícil de lo que debería ser, esto lo prueba. No hay forma de que alguien pueda recordar la existencia de la mayoría de los comandos de git, y mucho menos sus banderas y peculiaridades. El modelo Git tiene sentido y funciona hasta que sigues un flujo simple, y tan pronto como te atascas, te quedas atascado.
Muhammad Umer
2
Esta es la solución que funciona para mí, necesitaba el--ignore-unmatch
guhur
3

usar esto funcionó para mí

git rm -f --cached <filename>
Andreia Oliveira
fuente
1

Estas cadenas funcionan en mi caso:

  1. git rm -r WebApplication/packages

Hubo un git-dialog de confirmación. Debe elegir la opción "y".

  1. git commit -m "blabla"
  2. git push -f origin <ur_branch>
Ustin
fuente
0
git stash 

hizo el trabajo, restauró los archivos que había eliminado usando en rmlugar de git rm.

Primero hice un checkout del último hash, pero no creo que sea necesario.

usuario1767316
fuente
0

Para eliminar el archivo confirmado antiguo y rastreado de git, puede usar el siguiente comando. Aquí, en mi caso, quiero destrabar y eliminar todo el archivo del distdirectorio.

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch dist' --tag-name-filter cat -- --all

Luego, debe agregarlo a su .gitignorepara que no se rastree más.

Kiran Maniya
fuente
-1

Tenía un directorio duplicado (~ web / web) y eliminó el duplicado anidado cuando ejecuté rm -rf webmientras estaba dentro de la primera carpeta web.

ccsinsf
fuente
¡Lo siento! Debo haber leído mal la pregunta. Pensé que ese era el objetivo
ccsinsf