Voici une question qui se pose fréquemment lorsque vous vous lancez dans Git : « Comment demander à Git de ne plus suivre un ou plusieurs fichiers ? » La commande git rm permet de supprimer des fichiers d'un dépôt Git, soit l'opération inverse de la commande git add.

Présentation de la commande git rm

La commande git rm peut être utilisée pour supprimer des fichiers individuels ou une série de fichiers. La commande git rm a pour fonction principale de supprimer les fichiers suivis de l'index Git. En outre, la commande git rm permet de supprimer des fichiers de l'index de staging et du répertoire de travail. Aucune option n'est disponible pour supprimer un fichier du répertoire de travail uniquement. Les fichiers utilisés doivent être identiques aux fichiers dans l'élément HEAD actuel. En cas de divergence entre la version HEAD d'un fichier et la version de l'index de staging ou de l'arborescence de travail, Git bloque la suppression. Ce blocage est un mécanisme de sécurité pour éviter la suppression des changements en cours.

Notez que la commande git rm ne supprime pas de branches. En savoir plus sur l'utilisation de branches Git

Utilisation

<file>…​

Spécifie les fichiers cible à supprimer. La valeur de l'option peut être un fichier individuel, une liste de fichiers délimitée dans l'espace file1 file2 file3 ou un modèle Glob de fichier comprenant des caractères génériques (~./directory/*).

-f
--force

L'option -f permet de remplacer le contrôle de sécurité effectué par Git pour garantir que les fichiers dans HEAD correspondent au contenu actuel de l'index de staging et du répertoire de travail.

-n
--dry-run

L'option « dry run » est un mécanisme de protection qui exécute la commande git rm, mais ne supprime pas les fichiers. À la place, elle génère les fichiers qu'elle aurait dû supprimer.

-r

L'option -r est un raccourci pour « recursive ». En mode « recursive », la commande git rm supprime un répertoire cible et l'ensemble de son contenu.

--

L'option de séparateur permet de différencier clairement une liste de noms de fichier et les arguments transmis à la commande git rm. Cette option est utile si certains noms de fichier présentent une syntaxe qui pourrait être confondue avec d'autres options.

--cached

L'option --cached indique que la suppression devrait uniquement être effectuée sur l'index de staging. Les fichiers du répertoire de travail ne sont pas impactés.

--ignore-unmatch

Cette option force la commande à quitter en renvoyant l'état « 0, sigterm », même si aucun fichier ne correspond. Il s'agit d'un code d'état de niveau Unix. Le code 0 indique que l'appel de la commande a réussi. L'option --ignore-unmatch peut être utile lorsque vous lancez la commande git rm dans le cadre d'un script Shell supérieur, qui doit échouer de façon élégante.

-q
--quiet

L'option --quiet masque la sortie de la commande git rm. Cette commande génère en principe une ligne pour chaque fichier supprimé.

Annulation d'une commande git rm

L'exécution de la commande git rm ne constitue pas une mise à jour permanente. Cette commande met à jour l'index de staging et le répertoire de travail. Ces changements sont uniquement conservés si un commit est créé et s'ils sont ajoutés à l'historique des commits. En d'autres termes, les changements peuvent être « annulés » à l'aide de commandes Git courantes.

git reset HEAD

Un reset rétablit l'index de staging et le répertoire de travail actuels dans le commit HEAD. Il annule une commande git rm.

git checkout .

Un check-out a le même effet et restaure la dernière version d'un fichier depuis HEAD.

Dans le cas où la commande git rm a été exécutée et où un commit qui conserve la suppression a été créé, la commande git reflog peut être utilisée pour trouver une référence située avant l'exécution de la commande git rm. En savoir plus sur l'utilisation de la commande git reflog.

Discussion

L'argument <file> attribué à la commande peut concerner des chemins précis, des modèles Glob de fichier comportant des caractères génériques ou des noms de répertoires exacts. La commande supprime uniquement les chemins actuellement commités dans le dépôt Git.

Le modèle Glob de fichier comprenant des caractères génériques correspond entre les répertoires. Il convient d'être prudent lors de l'utilisation de tels modèles Glob. Prenons les exemples suivants : directory/* et directory*. Le premier exemple supprime tous les sous-fichiers du répertoire directory/, alors que le second supprime tous les répertoires jumeaux, comme directory1 directory2 directory_whatever, ce qui peut renvoyer un résultat inattendu.

Périmètre de la commande git rm

La commande git rm fonctionne uniquement sur la branche actuelle. L'événement de suppression s'applique exclusivement aux arborescences du répertoire de travail et de l'index de staging. La suppression du fichier est uniquement conservée dans l'historique du dépôt si un commit est créé.

Pourquoi utiliser la commande git rm au lieu de la commande rm ?

Un dépôt Git reconnaît l'exécution d'une commande shell rm standard sur un fichier qu'il suit. Il met à jour le répertoire de travail pour refléter la suppression. Il ne met pas à jour l'index de staging avec la suppression. Une commande git add devra être exécutée sur les chemins de fichier supprimés pour ajouter les changements à l'index de staging. La commande git rm fait office de raccourci, puisqu'elle met à jour le répertoire de travail et l'index de staging avec la suppression.

Exemples

git rm Documentation/\*.txt

Cet exemple utilise un modèle Glob de fichier comprenant des caractères génériques pour supprimer tous les fichiers *.txt enfant du répertoire Documentation et de tous ses sous-répertoires.

Notez que l'astérisque * est échappé à l'aide de barres obliques dans cet exemple. Il s'agit d'un mécanisme de protection qui évite que l'interpréteur de commandes ne développe le caractère générique. Ce dernier développe ensuite les chemins d'accès des fichiers et des sous-répertoires du répertoire Documentation/.

git rm -f git-*.sh

Cet exemple utilise l'option --force et cible tous les fichiers git-*.sh comprenant des caractères génériques. Cette option supprime explicitement les fichiers cible du répertoire de travail et de l'index de staging.

Suppression de fichiers qui ne se trouvent plus dans le système de fichiers

Comme indiqué ci-dessus dans la section « Pourquoi utiliser la commande git rm au lieu de la commande rm » , git rm est en fait une commande pratique, qui combine la commande shell rm standard et git add pour supprimer un fichier du répertoire de travail et promouvoir cette suppression dans l'index de staging. Un dépôt peut entrer dans un état complexe dans le cas où plusieurs fichiers ont été supprimés en utilisant uniquement la commande shell rm standard.

Si le but est d'enregistrer tous les fichiers explicitement supprimés dans le cadre du commit suivant, git commit -a ajoutera toutes les suppressions à l'index de staging pour préparer le commit suivant.

Toutefois, si le but est de supprimer définitivement les fichiers supprimés à l'aide de la commande shell rm, exécutez la commande suivante :

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

Cette commande génère une liste des fichiers supprimés du répertoire de travail et l'ajoute à git rm --cached, qui mettra à jour l'index de staging.

Résumé de la commande git rm

git rm est une commande qui fonctionne sur deux des principales arborescences de gestion des états internes de Git : le répertoire de travail et l'index de staging. La commande git rm permet de supprimer un fichier d'un dépôt Git. Cette méthode pratique associe les actions de la commande shell rm par défaut et de la commande git add. En d'autres termes, elle supprime une cible du système de fichiers avant d'ajouter cette suppression à l'index de staging. À l'instar de nombreuses autres commandes, celle-ci permet d'annuler les changements dans Git.