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.
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 :
- 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/
- Maintenant, créons un simple fichier texte :
echo "Hello, Git!" > hello.txt
- 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)
- Ajoutez le fichier à l'index Git :
git add hello.txt
- 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 :
- Assurez-vous d'être toujours dans le répertoire
git-index-demo:
cd ~/project/git-index-demo
- 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
- 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'
- 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)
- 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.
- Créons un autre fichier pour comprendre comment supprimer plusieurs fichiers de l'index :
echo "Another file" > another.txt
git add another.txt
- 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
- 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
- Pour supprimer les deux fichiers de l'index en même temps :
git rm --cached hello.txt another.txt
- 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 à
.gitignoremais 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 :
- Assurez-vous d'être toujours dans le répertoire
git-index-demo:
cd ~/project/git-index-demo
- Ajoutons nos fichiers existants à l'index :
git add hello.txt another.txt
- 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
- Créez un fichier journal qui simule un fichier généré que nous ne voulons pas suivre :
echo "Some log data" > application.log
- 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 :
- Créez un fichier
.gitignorepour spécifier que nous voulons ignorer tous les fichiers.log:
echo "*.log" > .gitignore
- 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.
- Ajoutons et validons le fichier
.gitignore:
git add .gitignore
git commit -m "Add .gitignore file"
- 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'
- 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.
- Validons ce changement :
git commit -m "Stop tracking application.log"
- Vérifiez l'état une fois de plus :
git status
Vous devriez voir :
On branch master
nothing to commit, working tree clean
- 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
- 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_modulesdans les projets JavaScript)
En utilisant git rm --cached avec .gitignore, vous pouvez :
- Arrêter de suivre les fichiers qui devraient être ignorés
- Conserver les fichiers dans votre système de fichiers local
- 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 :
- Assurez-vous d'être toujours dans le répertoire
git-index-demo:
cd ~/project/git-index-demo
- 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
- Ajoutez et committez ce fichier :
git add config.properties
git commit -m "Add configuration file"
- 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
- 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
- Ajoutez le fichier modèle à Git :
git add config.properties.template
- Mettez à jour le fichier
.gitignorepour ignorer le vrai fichier de configuration mais suivre le modèle :
echo "config.properties" >> .gitignore
- Ajoutez le fichier
.gitignoremis à jour et committez ces modifications :
git add .gitignore
git commit -m "Remove sensitive config from tracking, add template instead"
- Vérifions le statut de notre dépôt :
git status
Vous devriez voir :
On branch master
nothing to commit, working tree clean
- 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
- 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 --cachedpour supprimer des fichiers individuels et multiples de l'index - Intégrer
git rm --cachedavec.gitignorepour 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.



