Close

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
Logotipo de Git
Material relacionado

Chuleta de Git

Logotipo de Bitbucket
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 .gitignore de repositorios. 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.

Gente que colabora utilizando un muro lleno de herramientas

Blog de Bitbucket

Ilustración de Devops

Ruta de aprendizaje de DevOps

Demostraciones de funciones con expertos de Atlassian del Centro de demostraciones

Cómo funciona Bitbucket Cloud con Atlassian Open DevOps

Suscríbete para recibir el boletín de DevOps

Thank you for signing up