En esta sección, nos centraremos en una discusión detallada del comando git clean
. Git clean
es hasta cierto punto un comando de «deshacer». Git clean
puede considerarse complementario a otros comandos como git reset
y git checkout
. Mientras que estos otros comandos operan sobre archivos previamente añadidos al índice de seguimiento de Git, el comando git clean
opera sobre archivos no rastreados. Los archivos no rastreados son archivos que han sido creados dentro del directorio de trabajo de tu repo pero que aún no han sido añadidos al índice de rastreo del repositorio utilizando el comando git add
. Para demostrar mejor la diferencia entre archivos rastreados y no rastreados considere el siguiente ejemplo de línea de comandos:
$ 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 ..." to unstage) new file: tracked_file Untracked files: (use "git add ..." to include in what will be committed) untracked_dir/ untracked_file
El ejemplo crea un nuevo repositorio Git en el directorio git_clean_test
. A continuación, procede a crear un tracked_file
que se añade al índice Git, además, se crea un untracked_file
y un untracked_dir
. A continuación, el ejemplo invoca a git status
que muestra una salida que indica el estado interno de Git de cambios rastreados y no rastreados. Con el repositorio en este estado, podemos ejecutar el comando git clean
para demostrar su propósito.
$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
En este punto, ejecutar el comando git clean
por defecto puede producir un error fatal. El ejemplo anterior demuestra cómo puede ser esto. Por defecto, Git está configurado globalmente para requerir que a git clean
se le pase una opción «force» para iniciarse. Este es un importante mecanismo de seguridad. Cuando se ejecuta finalmente git clean
no se puede deshacer. Cuando se ejecuta completamente, git clean
hará un borrado duro del sistema de archivos, similar a la ejecución de la utilidad rm de la línea de comandos. Asegúrese de que realmente quiere borrar los archivos no rastreados antes de ejecutarlo.
Opciones comunes y uso
Dada la explicación anterior de los comportamientos y advertencias por defecto de git clean
, el siguiente contenido demuestra varios casos de uso de git clean
y las opciones de línea de comandos que lo acompañan y que son necesarias para su funcionamiento.
-n
La opción -n
realizará una «ejecución en seco» de git clean
. Esto le mostrará qué archivos se van a eliminar sin eliminarlos realmente. Es una buena práctica realizar siempre primero una ejecución en seco de git clean
. Podemos demostrar esta opción en el repo de demostración que creamos anteriormente.
$ git clean -n Would remove untracked_file
La salida nos dice que untracked_file
se eliminará cuando se ejecute el comando git clean
. Observe que el untracked_dir
no se reporta en la salida aquí. Por defecto git clean
no operará recursivamente en los directorios. Este es otro mecanismo de seguridad para prevenir el borrado permanente accidental.
-f or --force
La opción force inicia el borrado real de los archivos no rastreados del directorio actual. Force es necesaria a menos que la opción de configuración clean.requireForce
se establezca en false. Esto no eliminará las carpetas o archivos no rastreados especificados por .gitignore
. Ejecutemos ahora un git clean
en nuestro repo de ejemplo.
$ git clean -f Removing untracked_file
El comando mostrará los archivos que se eliminan. Puedes ver aquí que untracked_file
ha sido eliminado. Ejecutar git status
en este punto o hacer un ls
mostrará que untracked_file
ha sido eliminado y no se encuentra en ninguna parte. Por defecto git clean -f
operará sobre todos los archivos no rastreados del directorio actual. Además, se puede pasar un valor con la opción -f
que eliminará un archivo específico.
git clean -f -d include directories
La opción -d
indica a git clean
que también quiere eliminar cualquier directorio no rastreado, por defecto ignorará los directorios. Podemos añadir la opción -d
a nuestros ejemplos anteriores:
$ git clean -dn Would remove untracked_dir/ $ git clean -df Removing untracked_dir/
Aquí hemos ejecutado un ‘dry run’ usando la combinación -dn
que da como resultado que untracked_dir
está para ser eliminado. Luego ejecutamos una limpieza forzada, y recibimos la salida de que untracked_dir
es eliminado.
-x force removal of ignored files
Un patrón común de lanzamiento de software es tener un directorio de construcción o distribución que no está comprometido con el índice de seguimiento de los repositorios. El directorio de construcción contendrá artefactos de construcción efímeros que se generan a partir del código fuente comprometido. Este directorio de construcción se suele añadir al archivo .gitignore
de los repositorios. Puede ser conveniente limpiar también este directorio con otros archivos no rastreados. La opción -x
le dice a git clean
que también incluya cualquier archivo ignorado. Al igual que con las invocaciones anteriores de git clean
, es una buena práctica ejecutar un ‘simulacro’ primero, antes de la eliminación final. La opción -x
actuará sobre todos los archivos ignorados, no sólo sobre los específicos del proyecto. Esto podría ser cosas no deseadas como archivos de configuración del IDE.
git clean -xf
Al igual que la opción -d
-x
puede ser pasada y compuesta con otras opciones. Este ejemplo demuestra una combinación con -f
que eliminará los archivos no rastreados del directorio actual, así como cualquier archivo que Git suele ignorar.
Modo interactivo o git clean interactive
Además de la ejecución de línea de comandos ad-hoc que hemos demostrado hasta ahora, git clean
tiene un modo «interactivo» que puede iniciar pasando la opción -i
. Volvamos a visitar el repo de ejemplo de la introducción de este documento. En ese estado inicial, iniciaremos una sesión interactiva de limpieza.
$ 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
para que también actúe sobre nuestro untracked_dir
. El modo interactivo mostrará un prompt What now>
que solicita un comando para aplicar a los archivos no rastreados. Los comandos en sí son bastante autoexplicativos. Vamos a echar un breve vistazo a cada uno en un orden aleatorio comenzando con el comando 6: help
. Seleccionando el comando 6 se explicarán mejor los otros 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 sencillo y saldrá de la sesión interactiva.
1: clean
Borrará los elementos indicados. Si ejecutáramos 1: clean
en este punto se eliminaría untracked_dir/ untracked_file
.
4: ask each
Itinerará sobre cada archivo no rastreado y mostrará un aviso de Y/N
para un borrado. Se parece a lo siguiente:
*** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help What now> 4 Remove untracked_dir/ ? N Remove untracked_file ? N
2: filter by pattern
Mostrará un aviso adicional que toma la entrada utilizada 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í introducimos el patrón comodín *_file
que luego restringe la lista de archivos sin seguimiento a sólo untracked_dir
.
3: select by numbers
De manera similar al comando 2, el comando 3 funciona para refinar la lista de nombres de archivos sin seguimiento. La sesión interactiva preguntará por los números que corresponden a un nombre de archivo no rastreado.
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
Para recapitular, git clean
es un método conveniente para borrar los archivos no rastreados en el directorio de trabajo de un repo. Los archivos no rastreados son aquellos que están en el directorio del repo pero que aún no han sido añadidos al índice del repo con git add
. En general, el efecto de git clean
puede lograrse utilizando git status
y las herramientas de borrado nativas del sistema operativo. Git clean
puede usarse junto con git reset
para deshacer completamente cualquier adición y confirmación en un repositorio.