Una pregunta habitual al empezar a trabajar con Git es "¿Cómo le indico a Git que ya no realice el seguimiento de un archivo (o varios archivos)?" El comando git rm se usa para eliminar archivos de un repositorio de Git. Se puede considerar que es lo contrario a lo que hace el comando git add.

Descripción general de "git rm"

El comando git rm se puede usar para eliminar los archivos individuales o un conjunto de ellos. La función principal de git rm es eliminar los archivos en seguimiento del índice de Git. Además, git rm se puede usar para eliminar archivos tanto del índice del entorno de ensayo como del directorio de trabajo. No existe la opción de eliminar un archivo solo del directorio de trabajo. Los archivos sobre los que se está trabajando deben ser idénticos a los archivos del HEAD actual. Si existe alguna discrepancia entre la versión del HEAD de un archivo y el índice del entorno de ensayo o la versión del árbol de trabajo, Git no permitirá que se eliminen los archivos. Se trata de un mecanismo de seguridad para evitar la eliminación de cambios en curso.

Ten en cuenta que git rm no elimina ramas. Obtén más información sobre cómo usar las ramas de git.

Uso

<file>…​

Especifica los archivos de destino que se van a eliminar. El valor de opción puede ser un archivo individual, una lista de archivos delimitada por espacios file1 file2 file3 o un patrón global de archivos con caracteres comodín (~./directory/*).

-f
--force

La opción -f se usa para reemplazar la comprobación de seguridad que Git realiza para garantizar que los archivos en HEAD coinciden con el contenido actual del índice del entorno de ensayo y del directorio de trabajo.

-n
--dry-run

La opción "dry run" es una protección que ejecutará el comando git rm pero que no elimina realmente los archivos. En realidad, mostrará como resultado los archivos que habría eliminado.

-r

La opción -r es la abreviatura de "recursive". Al trabajar en modo recursivo, git rm eliminará el directorio de destino y todo el contenido de dicho directorio.

--

La opción de separador se usa para distinguir de forma explícita entre una lista de nombres de archivo y los argumentos que se van a transmitir a git rm. Esto resulta útil si algunos de los nombres de archivo tienen una sintaxis que pueda ser errónea para otras opciones.

--cached

La opción "cached" especifica que la eliminación solo debe realizarse en el índice de entorno de ensayo. Los archivos del directorio de trabajo quedarán aparte.

--ignore-unmatch

Esto hace que el comando dé como resultado un estado de sigterm 0 incluso aunque no haya archivos coincidentes. Este es un código de estado de nivel Unix. El código 0 indica una invocación correcta del comando. La opción --ignore-unmatch puede resultar útil cuando se use git rm como parte de un script de shell mayor que deba fallar de forma elegante.

-q
--quiet

La opción "quiet" oculta el resultado del comando git rm. El comando suele dar como resultado una línea para cada archivo eliminado.

Cómo deshacer el comando git rm

La ejecución del comando git rm no es una actualización permanente. El comando actualizará el índice del entorno de ensayo y el directorio de trabajo. Estos cambios no se almacenarán hasta que se cree una nueva confirmación y se añadan al historial de confirmaciones. Esto implica que los cambios se pueden "deshacer" mediante los comandos habituales de Git.

git reset HEAD

Con la opción "reset" se revertirán el índice del entorno de ensayo y el directorio de trabajo actuales a la confirmación HEAD. De este modo, se anulará el comando git rm.

git checkout .

El uso de la opción "checkout" tendrá el mismo efecto y restaurará la última versión del archivo de HEAD.

En caso de que se haya ejecutado git rm y se haya creado una nueva confirmación que conserve la eliminación, se puede usar git reflog para encontrar una referencia que sea anterior a la ejecución de git rm. Obtén más información sobre cómo usar git reflog.

Análisis

El argumento proporcionado al comando pueden ser rutas exactas, patrones globales de archivos con caracteres comodín o nombres exactos de directorios. El comando solo elimina rutas confirmadas actualmente en el repositorio de Git.

Los patrones globales de archivos con caracteres comodín coinciden en los directorios. Es importante usar con precaución estos patrones. Observa los siguientes ejemplos: directory/* y directory*. En el primer ejemplo, se eliminarán todos los archivos secundarios de directory/; mientras que, en el segundo, todos los directorios del mismo nivel, como directory1 directory2 directory_whatever, lo cual puede dar lugar a un resultado inesperado.

Ámbito de actuación de "git rm"

El comando git rm solo actúa en la rama actual. La eliminación solo se aplica al directorio de trabajo y a los árboles de índice del entorno de ensayo. La eliminación del archivo no se almacena en el historial de repositorios hasta que se cree una nueva confirmación.

Por qué usar "git rm" en lugar de "rm"

Un repositorio de Git reconocerá cuándo se ha ejecutado un comando rm de shell habitual en un archivo en seguimiento. Se actualizará el directorio de trabajo para reflejar la eliminación. Por el contrario, el índice del entorno de ensayo no se actualizará. Será necesario ejecutar un comando git add adicional en las rutas del archivo eliminado para añadir los cambios al índice del entorno de ensayo. El comando git rm actúa como acceso rápido en el que se actualizará el directorio de trabajo y el índice del entorno de ensayo con la eliminación.

Ejemplos

git rm Documentation/\*.txt

Este ejemplo usa un patrón global de archivos con caracteres comodín para eliminar todos los archivos *.txt que dependen del directorio Documentation y cualquiera de sus subdirectorios.

Ten en cuenta que el asterisco (*) se escapa con barras oblicuas en este ejemplo. Se trata de una protección que evita que el shell expanda el carácter comodín. Este carácter comodín expande los nombres de rutas de los archivos y subdirectorios dentro del directorio Documentation/.

git rm -f git-*.sh

En este ejemplo se usa la opción "force" y se dirige a todos los archivos git-*.sh con caracteres comodín. Esta opción elimina de forma explícita los archivos de destino tanto del directorio de trabajo como del índice del entorno de ensayo.

Cómo eliminar archivos que ya no están en el sistema de archivos

Como se ha indicado anteriormente en la sección "Por qué usar git rm en lugar de rm", git rm es en realidad un comando de conveniencia que combina el comando rm de shell estándar y git add para eliminar un archivo del directorio de trabajo y promover dicha eliminación al índice del entorno de ensayo. En los repositorios puede ser complicado en caso de que se hayan eliminado varios archivos solo con el comando rm de shell estándar.

Si tienes la intención de registrar todos los archivos eliminados de forma explícita como parte de la siguiente confirmación, git commit -a añadirá todos los eventos de eliminación al índice del entorno de ensayo a modo de preparación para la siguiente confirmación.

No obstante, si quieres eliminar de forma permanente los archivos que han sido eliminados del shell rm, usa el siguiente comando:

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

Este comando generará una lista de archivos eliminados del directorio de trabajo y canalizará la lista a git rm --cached, por lo que se actualizará el índice del entorno de ensayo.

Resumen de "git rm"

git rm es un comando que actúa en dos de los árboles de gestión de estado interno de Git: el directorio de trabajo y el índice del entorno de ensayo. git rm se usa para eliminar un archivo de un repositorio de Git. Se trata de un método de conveniencia que combina el efecto del comando rm de shell predeterminado con git add. De este modo, se eliminará, en primer lugar, un archivo de destino del sistema de archivos y se añadirá ese evento de eliminación al índice del entorno de ensayo. Este comando es uno de los muchos que se pueden usar para deshacer los cambios en Git.