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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.