Comment utiliser git rm --cached pour supprimer un fichier de l'index Git

GitBeginner
Pratiquer maintenant

Introduction

Git est un puissant système de contrôle de version qui aide les développeurs à gérer efficacement leur base de code. Une tâche courante dans Git est de supprimer des fichiers de l'index, qui est la zone de préparation des modifications. Dans ce tutoriel, nous allons explorer comment utiliser la commande git rm --cached pour supprimer un fichier de l'index Git sans le supprimer de votre système de fichiers local.

Ceci est un Guided Lab, qui fournit des instructions étape par étape pour vous aider à apprendre et à pratiquer. Suivez attentivement les instructions pour compléter chaque étape et acquérir une expérience pratique. Les données historiques montrent que c'est un laboratoire de niveau débutant avec un taux de réussite de 100%. Il a reçu un taux d'avis positifs de 92% de la part des apprenants.

Comprendre l'index Git avec un exemple pratique

L'index Git, également connu sous le nom de zone de préparation (staging area), est un composant crucial du système de contrôle de version Git. Il sert de zone de stockage intermédiaire entre votre répertoire de travail et le dépôt Git. Lorsque vous apportez des modifications à vos fichiers, Git ne les valide pas automatiquement. Au lieu de cela, vous devez explicitement ajouter les modifications à l'index avant de les valider.

Créons un exemple simple pour comprendre comment fonctionne l'index Git :

  1. Tout d'abord, créons un nouveau répertoire pour notre projet et initialisons un dépôt Git :
mkdir git-index-demo
cd git-index-demo
git init

Vous devriez voir une sortie similaire à celle-ci :

Initialized empty Git repository in /home/labex/project/git-index-demo/.git/
  1. Maintenant, créons un simple fichier texte :
echo "Hello, Git!" > hello.txt
  1. Vérifiez l'état de votre dépôt :
git status

Vous devriez voir une sortie indiquant que hello.txt n'est pas suivi (untracked) :

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hello.txt

nothing added to commit but untracked files present (use "git add" to track)
  1. Ajoutez le fichier à l'index Git :
git add hello.txt
  1. Vérifiez à nouveau l'état :
git status

Vous devriez maintenant voir que le fichier est préparé pour la validation (staged for commit) :

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   hello.txt

Félicitations ! Vous venez d'ajouter un fichier à l'index Git. Remarquez que Git vous indique que vous pouvez utiliser git rm --cached <file> pour désindexer (unstage) le fichier, ce que nous allons apprendre exactement dans l'étape suivante.

L'index Git offre plusieurs avantages :

  • Il vous permet de choisir sélectivement les modifications à inclure dans votre prochaine validation (commit)
  • Vous pouvez préparer des parties spécifiques d'un fichier
  • Il fournit un aperçu de ce que votre prochaine validation inclura

Dans l'étape suivante, nous allons apprendre comment supprimer un fichier de l'index Git en utilisant la commande git rm --cached.

Utilisation de git rm --cached pour supprimer un fichier de l'index

Maintenant que nous avons un fichier dans l'index Git, apprenons à le supprimer en utilisant la commande git rm --cached. Cette commande supprime un fichier de l'index Git (zone de préparation) sans le supprimer de votre système de fichiers local.

Continuons avec notre exemple de l'étape précédente :

  1. Assurez-vous d'être toujours dans le répertoire git-index-demo :
cd ~/project/git-index-demo
  1. Vérifions l'état actuel de notre dépôt :
git status

Vous devriez voir que hello.txt est préparé pour la validation (dans l'index) :

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   hello.txt
  1. Maintenant, supprimons le fichier de l'index Git en utilisant la commande git rm --cached :
git rm --cached hello.txt

Vous devriez voir une sortie similaire à :

rm 'hello.txt'
  1. Vérifiez à nouveau l'état :
git status

Vous remarquerez que le fichier n'est plus suivi (untracked) :

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hello.txt

nothing added to commit but untracked files present (use "git add" to track)
  1. Confirmez que le fichier existe toujours dans votre système de fichiers local :
ls -l

Vous devriez voir hello.txt dans la sortie :

total 4
-rw-r--r-- 1 labex labex 11 [date] hello.txt

Cela confirme que git rm --cached a seulement supprimé le fichier de l'index Git, et non de votre système de fichiers local.

  1. Créons un autre fichier pour comprendre comment supprimer plusieurs fichiers de l'index :
echo "Another file" > another.txt
git add another.txt
  1. Vérifiez l'état :
git status

Vous devriez voir :

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   another.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hello.txt
  1. Maintenant, rajoutons hello.txt à l'index et voyons comment supprimer plusieurs fichiers :
git add hello.txt
git status

Vous devriez voir les deux fichiers dans l'index :

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   another.txt
        new file:   hello.txt
  1. Pour supprimer les deux fichiers de l'index en même temps :
git rm --cached hello.txt another.txt
  1. Vérifiez l'état une fois de plus :
git status

Les deux fichiers devraient maintenant être non suivis :

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        another.txt
        hello.txt

nothing added to commit but untracked files present (use "git add" to track)

La commande git rm --cached est particulièrement utile lorsque :

  • Vous avez accidentellement ajouté un fichier à l'index Git
  • Vous souhaitez arrêter de suivre un fichier sans le supprimer de votre système
  • Vous êtes sur le point d'ajouter un motif de fichier à .gitignore mais devez d'abord supprimer les fichiers existants de l'index
    Dans l'étape suivante, nous allons explorer quelques cas d'utilisation pratiques pour cette commande.

Cas d'utilisation pratiques avec .gitignore

L'un des cas d'utilisation les plus courants de git rm --cached est lorsque vous souhaitez arrêter de suivre des fichiers qui devraient être ignorés. Explorons cela avec un exemple pratique.

Création et validation de fichiers

Tout d'abord, créons une situation où nous avons accidentellement validé des fichiers que nous aurions dû ignorer :

  1. Assurez-vous d'être toujours dans le répertoire git-index-demo :
cd ~/project/git-index-demo
  1. Ajoutons nos fichiers existants à l'index :
git add hello.txt another.txt
  1. Maintenant, validons ces fichiers :
git commit -m "Initial commit"

Vous devriez voir une sortie confirmant la validation :

[master (root-commit) xxxxxxx] Initial commit
 2 files changed, 2 insertions(+)
 create mode 100644 another.txt
 create mode 100644 hello.txt
  1. Créez un fichier journal qui simule un fichier généré que nous ne voulons pas suivre :
echo "Some log data" > application.log
  1. Ajoutons et validons accidentellement ce fichier journal :
git add application.log
git commit -m "Add log file by mistake"

Vous devriez voir une sortie confirmant la validation :

[master xxxxxxx] Add log file by mistake
 1 file changed, 1 insertion(+)
 create mode 100644 application.log

Utilisation de .gitignore et git rm --cached

Maintenant, corrigeons notre erreur en créant un fichier .gitignore et en utilisant git rm --cached :

  1. Créez un fichier .gitignore pour spécifier que nous voulons ignorer tous les fichiers .log :
echo "*.log" > .gitignore
  1. Vérifiez l'état :
git status

Vous devriez voir :

On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        .gitignore

nothing added to commit but untracked files present (use "git add" to track)

Remarquez que même si nous avons le fichier .gitignore avec le motif *.log, le fichier application.log n'est pas répertorié comme étant modifié. En effet, .gitignore empêche uniquement l'ajout à l'index des fichiers non suivis. Les fichiers qui sont déjà suivis continueront à l'être.

  1. Ajoutons et validons le fichier .gitignore :
git add .gitignore
git commit -m "Add .gitignore file"
  1. Maintenant, supprimons le fichier journal de l'index Git tout en le conservant dans notre système de fichiers :
git rm --cached application.log

Vous devriez voir :

rm 'application.log'
  1. Vérifiez l'état :
git status

Vous devriez voir :

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        deleted:    application.log

Cela indique que la suppression du fichier du système de suivi de Git sera incluse dans la prochaine validation.

  1. Validons ce changement :
git commit -m "Stop tracking application.log"
  1. Vérifiez l'état une fois de plus :
git status

Vous devriez voir :

On branch master
nothing to commit, working tree clean
  1. Vérifions maintenant que le fichier existe toujours dans notre système de fichiers :
ls -l

Vous devriez voir que application.log existe toujours, ainsi que nos autres fichiers :

total 16
-rw-r--r-- 1 labex labex 13 [date] another.txt
-rw-r--r-- 1 labex labex 13 [date] application.log
-rw-r--r-- 1 labex labex 6  [date] .gitignore
-rw-r--r-- 1 labex labex 11 [date] hello.txt
  1. Essayons de modifier le fichier journal pour voir si Git suit les modifications :
echo "More log data" >> application.log
git status

Vous devriez voir :

On branch master
nothing to commit, working tree clean

Même si nous avons modifié le fichier journal, Git ne détecte aucun changement car le fichier est maintenant ignoré en raison du motif .gitignore.

C'est un flux de travail très courant lorsque vous validez accidentellement des fichiers qui devraient être ignorés, tels que :

  • Les artefacts de construction
  • Les fichiers journaux
  • Les fichiers de configuration contenant des informations sensibles
  • Les répertoires de dépendances (comme node_modules dans les projets JavaScript)

En utilisant git rm --cached avec .gitignore, vous pouvez :

  1. Arrêter de suivre les fichiers qui devraient être ignorés
  2. Conserver les fichiers dans votre système de fichiers local
  3. Les empêcher d'être ajoutés au dépôt à l'avenir

Exemple Avancé : Suppression d'Informations Sensibles

Un autre cas d'utilisation important pour git rm --cached est la suppression d'informations sensibles de l'historique de votre dépôt. Bien que Git soit conçu pour suivre les modifications, il peut arriver que vous committiez accidentellement des fichiers contenant des mots de passe, des clés d'API ou d'autres données sensibles.

Voyons comment gérer cette situation :

  1. Assurez-vous d'être toujours dans le répertoire git-index-demo :
cd ~/project/git-index-demo
  1. Créez un fichier simulant un fichier de configuration avec des informations sensibles :
echo "API_KEY=1234567890abcdef" > config.properties
echo "DATABASE_PASSWORD=supersecretpassword" >> config.properties
  1. Ajoutez et committez ce fichier :
git add config.properties
git commit -m "Add configuration file"
  1. Maintenant, supposons que vous réalisiez que vous avez committé des informations sensibles et que vous souhaitiez les retirer du suivi tout en conservant une copie locale :
git rm --cached config.properties
  1. Créez un fichier modèle qui ne contient pas les informations sensibles réelles :
echo "API_KEY=your_api_key_here" > config.properties.template
echo "DATABASE_PASSWORD=your_password_here" >> config.properties.template
  1. Ajoutez le fichier modèle à Git :
git add config.properties.template
  1. Mettez à jour le fichier .gitignore pour ignorer le vrai fichier de configuration mais suivre le modèle :
echo "config.properties" >> .gitignore
  1. Ajoutez le fichier .gitignore mis à jour et committez ces modifications :
git add .gitignore
git commit -m "Remove sensitive config from tracking, add template instead"
  1. Vérifions le statut de notre dépôt :
git status

Vous devriez voir :

On branch master
nothing to commit, working tree clean
  1. Vérifiez que les deux fichiers existent dans le système de fichiers :
ls -l config*

Vous devriez voir :

-rw-r--r-- 1 labex labex 60 [date] config.properties
-rw-r--r-- 1 labex labex 60 [date] config.properties.template
  1. Vérifiez quels fichiers sont suivis :
git ls-files | grep config

Vous ne devriez voir que :

config.properties.template

Ce modèle est couramment utilisé dans les projets pour :

  • Garder la configuration sensible hors du contrôle de version
  • Fournir des modèles pour que d'autres contributeurs créent leurs propres fichiers de configuration
  • Empêcher les commits accidentels d'informations sensibles

N'oubliez pas que si git rm --cached supprime le fichier des futurs commits, il ne le supprime pas de l'historique Git. Si vous avez déjà poussé des informations sensibles vers un dépôt distant, vous devrez peut-être prendre des mesures supplémentaires pour les supprimer complètement de l'historique.

Dans un scénario de projet réel, vous pourriez envisager de :

  • Faire pivoter immédiatement les identifiants divulgués
  • Utiliser des variables d'environnement au lieu de fichiers de configuration pour les informations sensibles
  • Utiliser des solutions dédiées de gestion des secrets pour les environnements de production

Ceci conclut notre exploration des cas d'utilisation pratiques de la commande git rm --cached !

Résumé

Dans ce tutoriel, vous avez appris à utiliser la commande git rm --cached pour supprimer des fichiers de l'index Git sans les supprimer de votre système de fichiers local. Voici ce que nous avons couvert :

  • Comprendre l'index Git (zone de staging) et son rôle dans le flux de travail Git
  • Utiliser git rm --cached pour supprimer des fichiers individuels et multiples de l'index
  • Intégrer git rm --cached avec .gitignore pour arrêter de suivre les fichiers qui doivent être ignorés
  • Appliquer ces concepts à des scénarios pratiques, tels que la suppression de fichiers validés accidentellement et la gestion des informations sensibles

Ces compétences sont essentielles pour maintenir un dépôt Git propre et gérer correctement ce qui est validé dans votre historique de contrôle de version. En tirant parti de git rm --cached, vous pouvez mieux contrôler quels fichiers sont suivis par Git tout en conservant votre répertoire de travail local intact.