Cómo eliminar archivos locales (sin seguimiento) del árbol de trabajo actual de Git

6843

¿Cómo se eliminan los archivos locales no rastreados de su árbol de trabajo actual?

Solo lectura
fuente
86
Esta hoja de referencia interactiva de git ndpsoftware.com/git-cheatsheet.html muestra el espacio de trabajo de git (google le ofrece mejores resultados con "espacio de trabajo" que con "copia de trabajo").
qneill 01 de
28
Nota: si solo desea eliminar algunos archivos no rastreados, pero no todos , ¡ git cleanahora tiene un modo interactivo ! Vea mi respuesta a esta otra pregunta : git 1.8.4+
VonC
17
Tenga en cuenta que no está eliminando archivos de git branch, ya que branch es una referencia a un commit y, por lo tanto, no contiene archivos sin seguimiento. Esos solo están presentes en el directorio de trabajo y no tienen nada que ver con las ramas. Probablemente sea solo una aclaración terminológica.
Pavel Šimerda
66
Para aclarar la comprensión de los no iniciados y los nuevos en Git, ejecute el estado de git y si muestra un archivo como no rastreado, y no desea ese archivo en el repositorio, puede ir a su sistema de archivos y eliminarlo o moverlo . Esto no hará nada malo a su repositorio local o a Git. También puede usar git cleano alguna variación en las respuestas a continuación, incluida la versión interactiva para eliminar solo archivos selectivos, pero el modo interactivo puede ser tedioso. Hagas lo que hagas, asegúrate de comprender qué git cleaneliminarás o usarás --dry-runpara que te lo diga sin eliminar nada.
LightCC
44
Si los archivos aún no se están rastreando, ¿no podría simplemente eliminarlos sin git? rm files-to-be-deleted
mhatch

Respuestas:

8735

git-clean - Elimina archivos no rastreados del árbol de trabajo

Sinopsis

git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <path>…​

Descripción

Limpia el árbol de trabajo eliminando de forma recursiva los archivos que no están bajo control de versiones, comenzando desde el directorio actual .

Normalmente, solo se eliminan los archivos desconocidos para Git, pero si -xse especifica la opción, también se eliminan los archivos ignorados. Esto puede, por ejemplo, ser útil para eliminar todos los productos de compilación.

Si <path>...se dan argumentos opcionales , solo esas rutas se ven afectadas.


El paso 1 es mostrar lo que se eliminará utilizando la -nopción:

# Print out the list of files which will be removed (dry run)
git clean -n

Paso limpio - cuidado: esto eliminará archivos :

# Delete the files from the repository
git clean -f
  • Para eliminar directorios, ejecute git clean -f -d ogit clean -fd
  • Para eliminar archivos ignorados, ejecute git clean -f -X ogit clean -fX
  • Para eliminar archivos ignorados y no ignorados, ejecute git clean -f -xogit clean -fx

Tenga en cuenta la diferencia de casos en elX los dos últimos comandos.

Si clean.requireForcese establece en "verdadero" (el valor predeterminado) en su configuración, es necesario especificarlo; de lo -fcontrario, no pasará nada.

Nuevamente vea los git-cleandocumentos para más información.


Opciones

-f, --force

Si la variable de configuración de Git clean.requireForce no está establecida en false, git clean se negará a ejecutarse a menos que se indique -f, -no -i.

-x

No use las reglas de ignorar estándar leídas de .gitignore (por directorio) y $GIT_DIR/info/exclude, pero aún use las reglas de ignorar dadas con -eopciones. Esto permite eliminar todos los archivos sin seguimiento, incluidos los productos de compilación. Esto se puede usar (posiblemente junto con git reset) para crear un directorio de trabajo prístino para probar una compilación limpia.

-X

Eliminar solo los archivos ignorados por Git. Esto puede ser útil para reconstruir todo desde cero, pero mantener archivos creados manualmente.

-n, --dry-run

En realidad, no elimine nada, solo muestre lo que se haría.

-d

Elimine los directorios sin seguimiento además de los archivos sin seguimiento. Si un directorio no rastreado es administrado por un repositorio Git diferente, no se elimina de manera predeterminada. Use la -fopción dos veces si realmente desea eliminar dicho directorio.

Ashkan Sirous
fuente
288
git clean -ffunciona solo en el directorio donde se llama (y subdirectorios). Si desea limpiar toda la copia de trabajo, debe llamarla en su directorio raíz.
Eduardo Bezerra
17
También está eliminando todos los archivos dentro de .gitignore. Necesito eliminar solo archivos / carpetas que son nuevos y no están en .gitignore
Kostanos
24
@Kostanos Si no desea eliminar los archivos que están en .gitignore, no proporcione el indicador -x.
Lo-Tan
52
git clean -f :/funciona como si lo hubiera ejecutado en el directorio raíz de repositorio. Ver también respuestas posteriores que también representan submódulos congit clean -ffxd :/
aquí
18
@Michelle git clean -xfd también QUITARÁ TODOS LOS ARCHIVOS ACTUALMENTE IGNORADOS EN SU .gitignore y no son recuperables
thedanotto
987

Use git clean -f -dpara asegurarse de que los directorios también se eliminen.

  1. En realidad, no elimine nada, solo muestre lo que se haría.

    git clean -n
    

    o

    git clean --dry-run
    
  2. Elimine los directorios sin seguimiento además de los archivos sin seguimiento. Si un directorio no rastreado es administrado por un repositorio Git diferente, no se elimina de manera predeterminada. Use la -fopción dos veces si realmente desea eliminar dicho directorio.

    git clean -fd
    

Luego puede verificar si sus archivos realmente se han ido git status.

robert.berger
fuente
115
Como se indicó anteriormente, es bueno git clean -n -d
usarlo
15
Lo mismo es hacer git clean -ndy git clean -fd.
Micer
478

Me sorprende que nadie haya mencionado esto antes:

git clean -i

Eso significa interactivo y obtendrá una visión general rápida de lo que se va a eliminar, ofreciéndole la posibilidad de incluir / excluir los archivos afectados. En general, aún más rápido que ejecutar el obligatorio--dry-run antes de la limpieza real.

Tendrá que agregar un -dsi también desea cuidar las carpetas vacías. Al final, es un buen alias:

git iclean

Dicho esto, el uso adicional de la mano de los comandos interactivos puede ser agotador para los usuarios experimentados. En estos días solo uso el ya mencionadogit clean -fd

Frank sistemático
fuente
16
@ pal4life Se agregó en 1.8.4, ¿podría estar ejecutando una versión anterior de git? github.com/git/git/blob/master/Documentation/RelNotes/1.8.4.txt
Mattias Backman
Me gusta esto: me siento más cómodo de tenerlo en mi historial de bash que cualquiera de las otras opciones, porque no es gran cosa si accidentalmente lo presiono ctrl-r o ctrl-p.
csvoss
¿Podría ser que git clean -isolo funciona si se llama desde la raíz de la copia de trabajo?
Alessandro Jacopson
250

Si el directorio sin seguimiento es un repositorio de git propio (por ejemplo, submódulo), debe usar -fdos veces:

git clean -d -f -f

Michał Szajbe
fuente
44
Por cierto, esto está escrito en la documentación : Git se negará a eliminar directorios con el subdirectorio o archivo .git a menos que se dé una segunda -f. ¡Pero gracias de cualquier manera!
Maxim Suslov
248

Manera simple de eliminar archivos no rastreados

Para eliminar todos los archivos no rastreados, la forma más sencilla es agregarlos todos primero y restablecer el repositorio como se muestra a continuación

git add --all
git reset --hard HEAD

Thanga
fuente
8
Puedes reemplazar git add --allpor git add .. Por lo tanto, puede hacerlo de manera más corta en línea git add . && git reset --hard HEAD (tenga mucho cuidado con este comando) .
RousseauAlexandre
22
¿Por qué usar esto git clean?
user2864740
8
Porque git cleanaparentemente también elimina todo lo que se ignora. Simplemente eliminó mi node_modulescarpeta. Hacer esto primero organizaría todos los archivos, excepto los ignorados, y luego los eliminaría haciendo un reinicio. Los archivos ignorados no serán tocados.
Andreas
55
@Andreas no elimina archivos ignorados para mí (git 2.14.1). Debe ejecutar degit clean -n todos modos antes de hacer la eliminación real (o uso git clean -i).
Qw3ry
8
git cleanelimina los archivos ignorados solo si usa la opción -xo -X, de lo contrario, solo elimina los archivos no rastreados.
doubleDown
140

Me gusta git stash push -uporque puedes deshacerlos todos git stash pop.

EDITAR: También encontré una manera de mostrar el archivo sin seguimiento en un alijo (por ejemplo git show stash@{0}^3 ) https://stackoverflow.com/a/12681856/338986

EDIT2: git stash saveestá en desuso a favor de push. Gracias @ script-wolf.

Hiroshi
fuente
3
¿Puedes explicar el -u en el alijo? No entiendo cómo funciona de manera diferente a git stash save. Intenté esto y funcionó. Busqué en git docs y tampoco pude encontrarlo allí.
Winnemucca
99
-ues equivalente a --include-untracked. Puedes encontrar ayuda con git help stash.
hiroshi
3
@hiroshi Gracias! Después de probar todas las soluciones de una docena de personas diferentes, esta es la que finalmente funcionó ... ¡vaya! Incluso un escondite git no hizo nada. El salvador se ocupó sin seguimiento. restablecer hard / clean force / etc ninguno de estos hizo nada por mí.
killjoy
3
La saveopción fue desaprobada a favor de push, que hace lo mismo pero más. Puede leer más aquí, /programming/44680028/whats-the-difference-between-git-stash-save-and-git-stash-push/44681952
Script Wolf
120

Esto es lo que siempre uso:

git clean -fdx

Para un proyecto muy grande, es posible que desee ejecutarlo un par de veces.

Oscar Fraxedas
fuente
@ Martin Uno de los proyectos en los que estoy trabajando tiene más de 8 años con más de 80 desarrolladores codificando activamente. Git a veces no puede limpiarlo en la primera pasada.
Oscar Fraxedas
1
Puedo confirmar esto, por lo que todavía es válido en 2020. También estamos trabajando en un gran proyecto y tuve que ejecutarlo 4-5 veces hasta que GIT no encontró más archivos para eliminar.
turbolocust
90

git-clean es lo que estás buscando. Se utiliza para eliminar archivos no rastreados del árbol de trabajo.

Espo
fuente
86

Si es necesario para eliminar archivos no rastreados de un subdirectorio particular,

git clean -f {dir_path}

Y forma combinada de eliminar directorios / archivos sin seguimiento y archivos ignorados.

git clean -fxd {dir_path}

después de esto, solo habrá modificado los archivos en git status.

Vijay C
fuente
68

Elimine todas las carpetas y archivos adicionales en este repositorio + submódulos

Esto te pone en el mismo estado que el clon nuevo.

git clean -ffdx

Elimine todas las carpetas y archivos adicionales en este repositorio pero no sus submódulos

git clean -fdx

Elimine carpetas adicionales pero no archivos (por ejemplo, compilación o carpeta de registros)

git clean -fd

Eliminar carpetas adicionales + archivos ignorados (pero no archivos recién agregados)

Si el archivo no se ignoró y aún no se registró, entonces permanece. Tenga en cuenta la X mayúscula.

git clean -fdX

Nuevo modo interactivo

git clean
Shital Shah
fuente
57

git clean -fd elimina el directorio

git clean -fX elimina archivos ignorados

git clean -fx elimina archivos ignorados y no ignorados

se pueden usar todas las opciones anteriores en combinación como

git clean -fdXx

consulte el manual de git para obtener más ayuda

Pooja
fuente
10
El comando git clean -fdXxproduce el mensaje de error "fatal: -x y -X no se pueden usar juntos" (usando git-2.8). Para su última oración dentro de su respuesta, proporcione un enlace al manual de git. Saludos
olibre
ejecuta los dos comandos en secuencia: git clean -fdX, git clean -fdx
Reloj ZHONG
55

OK, eliminar archivos y carpetas no rastreados no deseados es fácil de usar giten la línea de comandos, simplemente hazlo así:

git clean -fd

Verifique dos veces antes de hacerlo, ya que eliminará los archivos y carpetas sin hacer ningún historial ...

También en este caso, -fsignifica fuerza y-d significa directorio ...

Por lo tanto, si solo desea eliminar archivos, solo puede usar -f:

git clean -f

Si desea eliminar (directorios) y archivos, puede eliminar solo directorios y archivos sin seguimiento como este:

git clean -fd

Además, puede usar el -xindicador para incluir los archivos que git ignora. Esto sería útil si desea eliminar todo.

Y agregar -ibandera hace que git le pida permiso para eliminar archivos uno por uno sobre la marcha.

Si no está seguro y quiere verificar las cosas primero, agregue la -nbandera.

Úselo -qsi no desea ver ningún informe después de una eliminación exitosa.

También creo la imagen a continuación para que sea más memorable, ¡especialmente he visto a muchas personas confundirse -fpor limpiar carpetas a veces o mezclarlas de alguna manera!


eliminar archivos y carpetas no deseados no rastreados

Alireza
fuente
¿Qué pasa con esa imagen?
Pacerier
37

Una mejor manera es usar: git clean

git clean -d -x -f

Esto elimina los archivos no rastreados, incluidos los directorios (-d)y archivos ignorados por git (-x).

Además, reemplace el -fargumento con -npara realizar un modo interactivo dry-runo -ipara y le dirá qué se eliminará.

Chhabilal
fuente
25

Enfoque interactivo del usuario:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/arsdumpgenerator/s3/ [y/N]? y

-i para interactivo
-f para forzar
-d para directorio
-x para archivos ignorados (agregue si es necesario)

Nota: Agregue -n o --dry-run para verificar lo que hará.

bit_cracker007
fuente
20

Un truco salvavidas para tal situación que acabo de inventar y probar (que funciona perfectamente):

git add .
git reset --hard HEAD

¡Tener cuidado! Asegúrese de confirmar los cambios necesarios (incluso en archivos no rastreados) antes de realizar esto .

thybzi
fuente
3
Al menos este es un enfoque diferente. :) Otra forma, que recordaría los archivos eliminados en el reflog pero no en ninguna rama, sería:git add . git commit -m 'about to delete' git reset --hard HEAD~
joeytwiddle
2
aún más rápido esgit add . && git reset --hard HEAD
thybzi
3
git add . && git reset --hard
Pleymor
Es posible que esto no sea lo que desea si también hay cambios que desea confirmar.
lacostenycoder
@AlexanderMills git reset --hardrestablece todos los cambios no confirmados PERO ARCHIVOS SIN SEGUIMIENTO al estado de la última confirmación. Es por eso que primero necesitamos git add ., que organiza todos los archivos no rastreados (para que también se restablezcan)
thybzi
19

git clean -f -d -x $(git rev-parse --show-cdup)se aplica limpio al directorio raíz, sin importar dónde lo llame dentro de un árbol de directorio de repositorio. Lo uso todo el tiempo, ya que no te obliga a abandonar la carpeta donde trabajas ahora y permite limpiar y confirmar desde el lugar donde estás.

Asegúrese de que las banderas -f, -d, -xcoinciden con sus necesidades:

-d
       Remove untracked directories in addition to untracked files. If an
       untracked directory is managed by a different Git repository, it is
       not removed by default. Use -f option twice if you really want to
       remove such a directory.

-f, --force
       If the Git configuration variable clean.requireForce is not set to
       false, git clean will refuse to delete files or directories unless
       given -f, -n or -i. Git will refuse to delete directories with .git
       sub directory or file unless a second -f is given. This affects
       also git submodules where the storage area of the removed submodule
       under .git/modules/ is not removed until -f is given twice.

-x
       Don't use the standard ignore rules read from .gitignore (per
       directory) and $GIT_DIR/info/exclude, but do still use the ignore
       rules given with -e options. This allows removing all untracked
       files, including build products. This can be used (possibly in
       conjunction with git reset) to create a pristine working directory
       to test a clean build.

También hay otras banderas disponibles, solo verifique git clean --help.

Nikita Leonov
fuente
Por cierto, solo puede hacer git clean {flags}: / así será como si ejecutara el comando en la raíz del repositorio
The-null-Pointer-
19

Para mí solo lo siguiente funcionó:

git clean -ffdx

En todos los demás casos, recibí el mensaje "Skipping Directory" para algunos subdirectorios.

rahul286
fuente
2
Gracias. Dejé de lado -xy solía git clean -ffdevitar borrar archivos en .gitignore.
Feckmore
15

Si solo desea eliminar los archivos enumerados como no rastreados por 'git status'

git stash save -u
git stash drop "stash@{0}"

Prefiero esto a 'git clean' porque 'git clean' eliminará los archivos ignorados por git, por lo que su próxima compilación tendrá que reconstruir todo y también puede perder su configuración IDE.

jazzdev
fuente
3
Esto también eliminará los cambios válidos en los archivos rastreados. No lo recomendaría
code_dredd
2
Sí, primero querrá confirmar los cambios en los archivos rastreados.
jazzdev
14

Para saber qué se eliminará antes de eliminar realmente:

git clean -d -n

Producirá algo como:

Eliminaría sample.txt

Para eliminar todo lo que figura en la salida del comando anterior:

git clean -d -f

Producirá algo como:

Eliminando sample.txt

Omar Mowafi
fuente
11

Para eliminar los archivos no rastreados, primero debe usar el comando para ver los archivos que se verán afectados por la limpieza

git clean -fdn

Esto le mostrará la lista de archivos que se eliminarán. Ahora, para eliminar esos archivos, use este comando:

git clean -fd
Gaurav
fuente
11

Tenga cuidado al ejecutar el comando `git clean`.

Siempre use -n antes de ejecutar el comando real, ya que le mostrará qué archivos se eliminarán.

git clean -n -d 
git clean -f -d

Por defecto, git cleansolo eliminará los archivos no rastreados que no se ignoran. No se eliminará ningún archivo que coincida con un patrón en su .gitignore u otros archivos ignorados. Si también desea eliminar esos archivos, puede agregar un -xcomando de limpieza.

git clean -f -d -x

También hay un modo interactivo disponible -icon el comando clean

git clean -x -i

Alternativamente

Si no está 100% seguro de que eliminar su trabajo no comprometido es seguro, puede usar el escondite

git stash --all

También borrará su directorio pero le dará flexibilidad para recuperar los archivos en cualquier momento utilizando stash con apply o pop . Luego, en un momento posterior, puede limpiar su alijo usando:

git stash drop // or clean
DevWL
fuente
2
el alijo es una buena idea, sin embargo es posible que quieras utilizargit stash save and type some comment as to what this stash was for
lacostenycoder
9

git clean -f to remove untracked files from working directory.

He cubierto algunos conceptos básicos aquí en mi blog, git-intro-basic-command

ysk
fuente
9

El comando uggested para eliminar archivos no rastreados de git docs es git clean

git clean : elimina los archivos no rastreados del árbol de trabajo

Método sugerido: Modo interactivo mediante el uso git clean -i para que podamos tener control sobre él. deja ver las opciones disponibles restantes.

Opciones Disponibles:

git clean 
    -d -f -i -n -q -e -x -X (can use either)

Explicación:

1. -d

Elimine los directorios sin seguimiento además de los archivos sin seguimiento. Si un directorio no rastreado es administrado por un repositorio Git diferente, no se elimina de manera predeterminada. Use la opción -f dos veces si realmente desea eliminar dicho directorio.

2. -f, --force

Si la variable de configuración de Git clean.requireForce no está establecida en false, git clean se negará a ejecutarse a menos que se especifique -f, -n o -i.

3. -i, --interactivo

Muestra lo que se haría y limpia los archivos de forma interactiva. Consulte "Modo interactivo" para más detalles.

4. -n, --dry-run

En realidad, no elimine nada, solo muestre lo que se haría.

5. -q, --quiet

Cállate, solo informa errores, pero no los archivos que se eliminan correctamente.

6. -e, --excluir =

Además de los que se encuentran en .gitignore (por directorio) y $ GIT_DIR / info / exclude, también considere que estos patrones están en el conjunto de las reglas de ignorar vigentes.

7. -x

No use las reglas de ignorar estándar leídas de .gitignore (por directorio) y $ GIT_DIR / info / exclude, pero aún use las reglas de ignorar dadas con las opciones -e. Esto permite eliminar todos los archivos sin seguimiento, incluidos los productos de compilación. Esto se puede usar (posiblemente junto con git reset) para crear un directorio de trabajo prístino para probar una compilación limpia.

8. -X

Eliminar solo los archivos ignorados por Git. Esto puede ser útil para reconstruir todo desde cero, pero mantener archivos creados manualmente.

Mohideen bin Mohammed
fuente
Creo que tienes un error tipográfico, uggestedpero eso es sólo un " uggestionjajaja
lacostenycoder
8

El git cleancomando normal no elimina los archivos no rastreados con mi git version 2.9.0.windows.1.

$ git clean -fdx     # doesn't remove untracked files
$ git clean -fdx *   # Append star then it works!
kujiy
fuente
7

Podemos eliminar fácilmente los archivos locales no rastreados del árbol de trabajo git actual mediante el uso de los comentarios de git a continuación.

git reset [--soft | --mixed [-N] | --hard | --merge | --keep] [-q] [<commit>]

Ejemplo:

git reset --hard HEAD

Enlaces :

  1. https://git-scm.com/docs/git-reset
  2. ¿Cómo uso 'git reset --hard HEAD' para volver a un commit anterior?
  3. Restablezca la rama del repositorio local para que sea como el repositorio remoto HEAD
  4. https://jwiegley.github.io/git-from-the-bottom-up/3-Reset/4-doing-a-hard-reset.html
Elangovan
fuente
Esto también eliminará los cambios organizados para la confirmación, no solo los archivos no rastreados, que pueden no ser lo que desea.
áspero
No funciona: deja algunos archivos. git clean -ffdxes la solución
Eugene Gr. Philippov
7

Limpie el repositorio de git y todos los submódulos de forma recursiva

El siguiente comando limpiará el repositorio git actual y todos sus submódulos de forma recursiva:

(git clean -d -x -f && git submodule foreach --recursive git clean -d -x -f)
Sergey
fuente
seguramente esto debería usarse con gran precaución
lacostenycoder
6
git clean -f

eliminará los archivos no rastreados del git actual

git clean -fd

cuando desee eliminar directorios y archivos, esto eliminará solo los directorios y archivos sin seguimiento

Sudhir Vishwakarma
fuente
5

oh-my-zsh con zsh proporciona esos grandes alias a través del complemento git. También se pueden usar en bash.

gclean='git clean -fd'
gpristine='git reset --hard && git clean -dfx'

  • gclean elimina los directorios sin seguimiento además de los archivos sin seguimiento .
  • gpristinerestablezca los cambios locales, elimine los directorios no rastreados, los archivos no rastreados y no use las reglas de ignorar estándar leídas de .gitignore (por directorio) y $ GIT_DIR / info / exclude, pero aún use las reglas de ignorar dadas con las opciones -e. Esto permite eliminar todos los archivos sin seguimiento, incluidos los productos de compilación. Esto se puede usar (posiblemente junto con git reset) para crear un directorio de trabajo prístino para probar una compilación limpia .
ZenLulz
fuente
2
Gracias por sus comentarios, mi declaración fue confusa. Quería decir que los alias resaltados vienen automáticamente con oh-my-zsh. Obviamente funcionan muy bien bash. Edité mi respuesta para reflejar eso.
ZenLulz
4

Me gusta usar el git stashcomando, luego puedes obtener archivos escondidos y cambios. git cleanTambién es una buena opción, pero depende totalmente de sus requisitos. Aquí está la explicación de git stash y git clean, 7.3 Herramientas Git - Almacenamiento y limpieza

Zia
fuente