git clean
En esta sección, vamos a analizar en profundidad el comando git clean
. Git clean
es, en cierta medida, un comando para deshacer. Git clean
puede considerarse complementario de otros comandos como git reset y git checkout. Mientras que estos comandos operan en archivos agregados previamente al índice de seguimiento de Git, el comando git clean
opera en archivos sin seguimiento. Los archivos sin seguimiento son archivos que se han creado en el directorio de trabajo del repositorio, pero que no se han añadido al índice de seguimiento del repositorio con git add.
Para demostrar mejor la diferencia entre archivos con seguimiento y sin él, consulta esta línea de comandos de ejemplo.
$ mkdir git_clean_test
$ cd git_clean_test/
$ git init .
Initialized empty Git repository in /Users/kev/code/git_clean_test/.git/
$ echo "tracked" > ./tracked_file
$ git add ./tracked_file
$ echo "untracked" > ./untracked_file
$ mkdir ./untracked_dir && touch ./untracked_dir/file
$ git status
On branch master
Initial commit
Changes to be committed: (use "git rm --cached <file>..." to unstage)
new file: tracked_file
Untracked files: (use "git add <file>..." to include in what will be committed) untracked_dir/ untracked_file
Material relacionado
Chuleta de Git
VER LA SOLUCIÓN
Aprende a usar Git con Bitbucket Cloud
En el ejemplo se crea un nuevo repositorio de Git en el directorio git_clean_test
. A continuación, se procede a crear un tracked_file
que se añade al índice de Git. Además, se crea un untracked_file
y un untracked_dir
. A continuación, el ejemplo invoca git status
, que muestra un resultado en el que se indica el estado interno de Git de los cambios con seguimiento y sin él. Con el repositorio en este estado, podemos ejecutar el comando git clean
para demostrar el propósito previsto.
$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
En este punto, al ejecutar el comando predeterminado git clean
se puede producir un error fatal. En el ejemplo anterior puedes ver el aspecto que puede tener. De forma predeterminada, la configuración global de Git obliga a usar la opción “force” con el comando git clean
para que este se inicie. Es un mecanismo de seguridad importante. Cuando se ejecuta el comando git clean
, no se puede deshacer. Cuando se ejecuta por completo, git clean
hará una eliminación permanente del sistema de archivos, similar a ejecutar la utilidad rm de línea de comandos. Asegúrate de que quieres eliminar los archivos sin seguimiento antes de ejecutarlo.
Opciones y uso habituales
Una vez proporcionada la anterior explicación sobre los comportamientos y avisos predeterminados de git clean, el contenido que presentamos a continuación expone varios casos de uso de git clean y las opciones de línea de comandos correspondientes que son obligatorias para su funcionamiento.
-n
La opción -n realizará una ejecución de prueba (dry run) de git clean. Así se mostrará qué archivos se eliminarán sin eliminarlos realmente. Es recomendable realizar primero un dry run de git clean. Podemos demostrar esta opción en el repositorio de demo que creamos antes.
$ git clean -n
Would remove untracked_file
El resultado indica que untracked_file
se eliminará cuando se ejecute el comando git clean
. Observa que el untracked_dir
no se recoge en este resultado. De forma predeterminada, git clean
no funcionará de forma recursiva en directorios. Es otro mecanismo de seguridad para evitar la eliminación permanente por error.
-f or --force
La opción force inicia la eliminación real de archivos sin seguimiento del directorio actual. Es obligatoria, a menos que la opción de configuración clean.requireForce
se defina en “false”. No eliminará carpetas sin seguimiento ni archivos especificados por .gitignore
. Ahora, ejecutemos un git clean
en vivo en el repositorio de ejemplo.
$ git clean -f
Removing untracked_file
El comando dará como resultado los archivos eliminados. Aquí puedes ver que untracked_file
se ha eliminado. Ejecutar git status en este punto o hacer un ls mostrará que untracked_file se ha eliminado y no se encuentra. De forma predeterminada, git clean -f operará en todos los archivos sin seguimiento del directorio actual. Además, se puede pasar un valor < path > con la opción -f que eliminará un archivo específico.
git clean -f <path>
-d include directories
La opción -d le dice a git clean que también quieres eliminar directorios sin seguimiento. De forma predeterminada ignorará esos directorios. Podemos añadir la opción -d a los ejemplos anteriores:
$ git clean -dn
Would remove untracked_dir/
$ git clean -df
Removing untracked_dir/
Ejecutamos un dry run mediante la combinación -dn y el resultado indica que el untracked_dir se puede eliminar. Luego, ejecutamos una limpieza forzada y el resultado indica que el untracked_dir se ha eliminado.
-x force removal of ignored files
Un patrón de publicación de software habitual es tener un directorio de compilación o distribución que no está confirmado en el índice de seguimiento de repositorios. El directorio de compilación contendrá artefactos de compilación efímeros que se generan a partir del código fuente confirmado. Este directorio de compilación suele añadirse al archivo de repositorios .gitignore. También puede ser conveniente limpiar este directorio con otros archivos sin seguimiento. La opción -x le dice a git clean que incluya también los archivos ignorados. Al igual que con invocaciones anteriores git clean, es recomendable ejecutar primero un dry run antes de la eliminación final. La opción -x actuará en todos los archivos ignorados, no solo en los específicos de la compilación del proyecto. Podrían ser elementos no deseados como archivos de configuración IDE ./.idea.
git clean -xf
Al igual que la opción -d, -x se puede pasar y componer con otras opciones. Este ejemplo muestra una combinación con -f que eliminará archivos sin seguimiento del directorio actual, así como los archivos que Git suele ignorar.
Modo interactivo o comando "git clean" interactivo
Además de la ejecución de la línea de comandos ad hoc que hemos mostrado hasta el momento, git clean
cuenta con un modo "interactivo" que se puede iniciar mediante la opción -i
. Volvamos al repositorio de ejemplo de la introducción de este documento. En esa fase inicial, empezaremos con una sesión de limpieza interactiva.
$ git clean -di
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now>
Hemos iniciado la sesión interactiva con la opción -d
por lo que también actuará sobre el untracked_dir
. El modo interactivo nos preguntará qué queremos hacer a continuación mediante la consulta What now>
, es decir, nos pregunta qué comando se debe aplicar a los archivos sin seguimiento. Los comandos se explican por sí mismos. Echaremos un breve vistazo a cada uno en orden aleatorio comenzando por el comando 6: help
. Al seleccionar el comando 6, se obtiene más información sobre los demás comandos:
What now> 6
clean - start cleaning
filter by pattern - exclude items from deletion
select by numbers - select items to be deleted by numbers
ask each - confirm each deletion (like "rm -i")
quit - stop cleaning
help - this screen
? - help for prompt selection
5: quit
Es muy sencillo y cerrará la sesión interactiva.
1: clean
Eliminará los elementos indicados. Si ejecutáramos 1: clean
en este momento, se eliminaría untracked_dir/ untracked_file
.
4: ask each
Se irá iterando en todos los archivos sin seguimiento y mostrará un mensaje de Y/N
para confirmar el borrado. Tiene el siguiente aspecto:
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 4
Remove untracked_dir/ [y/N]? N
Remove untracked_file [y/N]? N
2: filter by pattern
Mostrará una consulta adicional que utiliza los datos introducidos para filtrar la lista de archivos sin seguimiento.
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 2
untracked_dir/ untracked_file
Input ignore patterns>> *_file
untracked_dir/
Aquí se introduce el patrón de caracteres comodín *_file
que sirve para restringir la lista de archivos sin seguimiento a solo untracked_dir
.
3: select by numbers
De forma parecida al comando 2, el comando 3 sirve para perfeccionar la lista de nombres de archivos sin seguimiento. La sesión interactiva solicitará números que correspondan a un nombre de archivo sin seguimiento.
Would remove the following items:
untracked_dir/ untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
What now> 3
1: untracked_dir/ 2: untracked_file
Select items to delete>> 2
1: untracked_dir/ * 2: untracked_file
Select items to delete>>
Would remove the following item:
untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
Resumen
En resumen, git clean
es un método útil para eliminar los archivos sin seguimiento en un directorio de trabajo del repositorio. Los archivos sin seguimiento son aquellos que se encuentran en el directorio del repositorio, pero que no se han añadido al índice del repositorio con git add. De manera general, el efecto de git clean
se puede lograr usando git status y las herramientas de eliminación nativas de los sistemas operativos. git clean
se puede usar junto con git reset para deshacer por completo las incorporaciones y confirmaciones en un repositorio.
Compartir este artículo
Tema siguiente
Lecturas recomendadas
Consulta estos recursos para conocer los tipos de equipos de DevOps o para estar al tanto de las novedades sobre DevOps en Atlassian.