¿Cómo eliminar archivos que se enumeran en .gitignore pero que aún están en el repositorio?

9 minutos de lectura

¿Como eliminar archivos que se enumeran en gitignore pero que
intrépido

Tengo algunos archivos en mi repositorio que deben ignorarse, los agregué a .gitignore pero, por supuesto, no se eliminan de mi repositorio.

Así que mi pregunta es, ¿hay algún comando mágico o secuencia de comandos que use una rama de filtro que pueda reescribir mi historial y eliminar todos estos archivos fácilmente? ¿O simplemente un comando que creará una confirmación que los eliminará?

  • Duplicado del archivo .gitignore sin ignorar

    usuario456814

    25 mayo 2014 a las 19:46


  • Similar a stackoverflow.com/questions/1274057/…

    – prueba

    06/04/2016 a las 11:00

  • Posible duplicado de ¿Cómo hacer que Git “se olvide” de un archivo que fue rastreado pero ahora está en .gitignore?

    – Stevoisiak

    8 de noviembre de 2017 a las 16:52

  • ADVERTENCIA: Si bien esto no eliminará el archivo físico de su local, eliminará los archivos de otras máquinas de desarrolladores en la próxima extracción de git. ¿Cómo hacer que Git “se olvide” de un archivo que se rastreó pero ahora está en .gitignore?

    – LF00

    12 de abril de 2019 a las 7:14

  • @Stevoisiak esto no es un duplicado de esa pregunta porque esta pregunta sobre TODOS los archivos ignorados y también tiene una mejor respuesta que cualquiera de las preguntas similares.

    – Omn

    21 de julio de 2019 a las 16:58

1646760494 928 ¿Como eliminar archivos que se enumeran en gitignore pero que
Samy Dindane

Puede eliminarlos del repositorio manualmente:

git rm --cached file1 file2 dir/file3

O, si tiene muchos archivos:

git rm --cached `git ls-files -i -c --exclude-from=.gitignore`

Pero esto no parece funcionar en Git Bash en Windows. Produce un mensaje de error. Lo siguiente funciona mejor:

git ls-files -i -c --exclude-from=.gitignore | xargs git rm --cached  

En PowerShell en Windows, esto funciona incluso mejor (maneja espacios en la ruta y los nombres de archivo):

git ls-files -i -c --exclude-from=.gitignore | %{git rm --cached $_}

Con respecto a reescribir toda la historia sin estos archivos, dudo mucho que haya una automático manera de hacerlo
Y todos sabemos que reescribir la historia es malo, ¿no? 🙂

  • Desafortunadamente, el comando Git Bash en Windows no funciona con rutas que contienen espacios

    –Nate Bundy

    23/04/2014 a las 18:50

  • @NateBundy si te refieres al hecho de que xargs no funcionará con espacios, la mayoría de las utilidades de la línea de comandos solucionan esto usando banderas especiales para que los espacios en blanco no importen. En mi cabeza no recuerdo para qué son las banderas git ls-files y xargs (Creo que podría ser -0 por xargs), pero puedes buscarlos.

    usuario456814

    25 mayo 2014 a las 19:50

  • “git ls-files -i –exclude-from=.gitignore” es muy útil, me dice qué archivos excluye .ignore.

    –Owen Cao

    25 de enero de 2019 a las 0:22

  • Me alegró encontrar estos comandos, PERO en realidad no elimina los archivos del repositorio. Cuando eliminé 2300 kB de imágenes, el tamaño del repositorio se redujo solo 10 kB. Por lo tanto, no se puede usar, por ejemplo, para hacer que el repositorio sea más pequeño y más rápido de transferir.

    – Jan Potužník

    22 de febrero de 2019 a las 7:41

  • Tenga en cuenta que independientemente de su directorio actual, --exclude-from= es relativo a la raíz de git. Entonces, si desea hacer esto para un .gitignore en un subdirectorio, use --exclude-from=[subdirectory]/.gitignore.

    – Marc Vangend

    2 de febrero de 2021 a las 8:40

¿Como eliminar archivos que se enumeran en gitignore pero que
gtatr

Una forma más fácil que funciona independientemente del sistema operativo es hacer

git rm -r --cached .
git add .
git commit -m "Drop files from .gitignore"

Básicamente elimina y vuelve a agregar todos los archivos, pero git add ignorará a los que están en .gitignore.

Utilizando el --cached La opción mantendrá los archivos en su sistema de archivos, por lo que no eliminará archivos de su disco.

Nota: Algunos señalaron en los comentarios que perderá el historial de todos sus archivos. Probé esto con git 2.27.0 en MacOS y es no el caso. Si desea comprobar lo que está sucediendo, compruebe su git diff HEAD~1 antes de empujar su compromiso.

  • ¿Cómo afecta esto a otros usuarios en el repositorio que ejecutan un jalar – mientras lo leo, ¿¿la carpeta que ya no queremos rastrear se eliminó? ¿Cómo podemos evitar esto? Solo queremos dejar de rastrear

    – snh_nl

    3 de noviembre de 2017 a las 10:36

  • ¿Qué quieres decir con mensaje de confirmación falso? Es un mensaje de compromiso real 😛 Puedes cambiar el mensaje, por supuesto, dependiendo de tus necesidades…

    – gtatr

    1 de agosto de 2019 a las 21:15

  • Solo por el bien de la integridad, necesita el comando git push al final.

    – Mariusz Bialobrzeski

    3 de marzo de 2020 a las 19:49

  • No hagas esto, eliminará el historial de todos los archivos.

    – agraciado

    18 de marzo de 2020 a las 2:50

  • Solo para aclarar un poco porque el git status Después de hacer git rm -r --cached . git add . puede dar un poco de miedo: estos tres comandos que proporciona @gtatr esencialmente eliminan archivos de git que fueron rastreados previamente, pero que desde entonces se agregaron a su archivo .gitignore. Cuando ejecuté esto por primera vez, vi un montón de archivos y me asusté por un segundo, pero luego de una inspección más profunda noté que todos eran archivos que figuraban en mi archivo .gitignore.

    – Logan Besecker

    11 de febrero de 2021 a las 19:54

1646760496 283 ¿Como eliminar archivos que se enumeran en gitignore pero que
Weiz

Como los archivos en .gitignore no están siendo rastreados, puede usar el limpiar Comando para eliminar recursivamente archivos que no están bajo control de versiones.

Utilizar git clean -xdn para realizar un ensayo y ver qué se eliminará.
Entonces usa git clean -xdf para ejecutarlo.

Básicamente, git clean -h o man git-clean(en Unix) le dará ayuda.

Tenga en cuenta que este comando también eliminará archivos nuevos que no están en el área de preparación.

Espero eso ayude.

  • Esta debería ser la respuesta aceptada. Realmente funciona (la respuesta aceptada no funcionó para mí, en macOS), y es mucho más limpio.

    –Roger Oba

    21/09/2016 a las 17:33

  • Esta respuesta no es aplicable: el OP dice que los archivos en .gitignore están siendo rastreado

    –Ken Williams

    15 de diciembre de 2016 a las 23:15

  • ¡TENER CUIDADO! Esto elimina permanentemente todos los archivos sin seguimiento, en lugar de simplemente eliminarlos de la rama.

    – Emanuel

    6 de marzo de 2018 a las 6:38

  • los git clean -xdn es un simulacro que no se eliminará. el próximo lo hará.

    – John Zaj

    18 dic 2018 a las 22:30


  • -1: Esta es una respuesta muy engañosa: el autor original quería eliminar del repositorio, no eliminar los archivos por completo. Estuve así de cerca de eliminar una carga de archivos dinámicos requeridos por mi IDE pero que no es necesario que estén en el repositorio.

    – Auspicio

    30 de diciembre de 2018 a las 14:11

Hice una solución muy sencilla al manipular la salida de la declaración .gitignore con sed:

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

Explicación:

  1. imprima el archivo .gitignore
  2. eliminar todos los comentarios de la impresión
  3. eliminar todas las líneas vacías
  4. agregue ‘git rm -r’ al comienzo de la línea
  5. ejecutar cada línea.

¿Como eliminar archivos que se enumeran en gitignore pero que
VonC

git clean(hombre) y git ls-files -i(hombre) tenía confusión sobre trabajar o mostrar rutas ignoradas dentro de un directorio ignorado, que se ha corregido con Git 2.32 (Q2 2021).

Eso significa que la versión 2021 de la respuesta aceptada sería:

git ls-files -i -c --exclude-from=.gitignore | xargs git rm --cached  
                ^^

Ver cometer b548f0f, cometer dd55fc0, cometer aa6e1b2, cometer a97c7a8, cometer 2e4e43a, cometer b338e9f, confirmar 7fe1ffd, cometer 7f9dd87 (12 de mayo de 2021) por Elías Newren (newren).
Ver cometer 4e689d8 (12 de mayo de 2021) por Derrick Stolee (derrickstolee).
(Combinado por Junio ​​C Hamano — gitster en cometer 33be43120 de mayo de 2021)

ls-files: error en -i a menos que se especifiquen -o o -c

Firmado por: Elijah Newren

ls-files --ignored(hombre) se puede usar junto con cualquiera --others o --cached.

Después de estar un poco perplejo y profundizar en el código, asumí que ls-files -i simplemente estaba roto y no imprimía nada y tenía un buen parche listo para enviar cuando finalmente me di cuenta de que -i se puede usar con --cached para encontrar ignorados rastreados.

Si bien eso fue un error de mi parte, y una lectura cuidadosa de la documentación podría haber aclarado esto, sospecho que es probable que otros también cometan este error.
De hecho, de dos usos en nuestro conjunto de pruebas, creo que uno de los dos cometió este error.
En t1306.13, NO hay archivos rastreados, y todas las exclusiones creadas y utilizadas en esa prueba y en pruebas anteriores, por lo tanto, tienen que ser sobre archivos sin rastrear.
Sin embargo, dado que estaban buscando un resultado vacío, el error pasó desapercibido ya que su comando erróneo también dio una respuesta vacía.

-i se usará la mayor parte del tiempo con -olo que sugeriría que simplemente podríamos hacer -i implicar -o en ausencia de un -o o -cpero eso sería una ruptura incompatible con versiones anteriores.
En su lugar, marquemos -i sin tampoco un -o o -c como un error, y actualice los dos casos de prueba relevantes para especificar su intención.

Eso significa sin -cobtendría (a partir de Git 2.32, segundo trimestre de 2021):

fatal: ls-files -i must be used with either -o or -c

Nota: esto todavía es un trabajo en progreso, ya que fue revertido en Git 2.32-rc2 pero arreglado con cometer 2c9f1bf, cometer 1df046b (27 de mayo de 2021) por Junio ​​C Hamano (gitster).
Ver cometer 906fc55 (27 de mayo de 2021) por Elías Newren (newren).
Ver cometer eef8148 (27 de mayo de 2021) por Derrick Stolee (derrickstolee).
(Combinado por Junio ​​C Hamano — gitster en cometer 329d63e28 de mayo de 2021)

dir: presentar readdir_skip_dot_and_dotdot() ayudante

Firmado por: Elijah Newren

1646760497 987 ¿Como eliminar archivos que se enumeran en gitignore pero que
Tobias Kienzler

Si realmente quiere podar su historial de .gitignored archivos, primero guardar .gitignore fuera del repositorio, por ejemplo, como /tmp/.gitignoreentonces corre

git filter-branch --force --index-filter \
    "git ls-files -i -X /tmp/.gitignore | xargs -r git rm --cached --ignore-unmatch -rf" \
    --prune-empty --tag-name-filter cat -- --all

Notas:

  • git filter-branch --index-filter corre en el .git directorio, creo, es decir, si desea usar una ruta relativa, debe anteponer una más ../ primero. Y aparentemente no puedes usar ../.gitignoreel actual .gitignore archivo, que produce un “fatal: no se puede usar ../.gitignore como un archivo de exclusión” por alguna razón (tal vez durante un git filter-branch --index-filter el directorio de trabajo está (considerado) vacío?)
  • Esperaba usar algo como git ls-files -iX <(git show $(git hash-object -w .gitignore)) en lugar de evitar copiar .gitignore en otro lugar, pero eso solo ya devuelve una cadena vacía (mientras que cat <(git show $(git hash-object -w .gitignore)) de hecho huellas .gitignoreel contenido de como se esperaba), por lo que no puedo usar <(git show $GITIGNORE_HASH) en git filter-branch
  • Si en realidad solo quieres .gitignore-limpiar una rama específica, reemplazar --all en la última línea con su nombre. los --tag-name-filter cat entonces podría no funcionar correctamente, es decir, probablemente no podrá transferir directamente las etiquetas de una sola sucursal correctamente

1646760497 908 ¿Como eliminar archivos que se enumeran en gitignore pero que
alex estilo

En Linux puedes usar este comando:

por ejemplo quiero borrar *.py~ entonces mi comando debería ser ==>

find . -name "*.py~" -exec rm -f {} \;

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad