Dans cette section, nous allons voir plus en détail la commande git clean. git clean est, dans une certaine mesure, une commande d'annulation. git clean peut être considérée comme un complément à d'autres commandes, telles que git reset et git checkout. Tandis que ces autres commandes agissent sur les fichiers précédemment ajoutés à l'index de suivi Git, la commande git clean fonctionne sur les fichiers non suivis. Ces fichiers ont été créés dans le répertoire de travail de votre dépôt, mais n'ont pas encore été ajoutés à l'index de suivi de celui-ci à l'aide de la commande git add. Pour mieux illustrer la différence entre les fichiers suivis et non suivis, observons l'exemple de ligne de commande suivant :

 $ 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

L'exemple crée un dépôt Git dans le répertoire git_clean_test. Il crée ensuite un fichier tracked_file qui est ajouté à l'index Git, ainsi qu'un fichier untracked_file et un répertoire untracked_dir. L'exemple appelle ensuite git status, qui affiche une sortie indiquant l'état interne des changements Git suivis et non suivis. Lorsque le dépôt est à cet état, nous pouvons exécuter la commande git clean pour démontrer son objectif visé.

 $ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean

À ce stade, exécuter la commande git clean par défaut peut entraîner une erreur fatale. L'exemple ci-dessus montre ce à quoi cela pourrait ressembler. Par défaut, Git est globalement configuré pour exiger que l'option « force » soit transmise avec la commande git clean afin que celle-ci puisse se lancer. C'est un mécanisme de sécurité important. Lorsque vous exécutez la commande git clean, vous ne pouvez plus l'annuler. Exécutée à son terme, git clean effectue une suppression définitive du système de fichiers, à l'instar de la commande rm. Assurez-vous de vouloir vraiment supprimer les fichiers non suivis avant de l'exécuter.

Options courantes et utilisation

Étant donné l'explication précédente des comportements et des mises en garde git clean par défaut, le contenu ci-dessous présente plusieurs cas d'usage de git clean et les options de ligne de commande connexes requises pour leur fonctionnement.

-n

L'option -n effectue un « dry run » de git clean. Vous voyez ainsi les fichiers qui vont être supprimés sans le faire réellement. Il est recommandé de toujours exécuter en premier lieu un « dry run » de git clean. Nous pouvons illustrer le fonctionnement de cette option dans le dépôt de démo créé tout à l'heure.

 $ git clean -n Would remove untracked_file

La sortie nous indique que le fichier untracked_file sera supprimé lors de l'exécution de la commande git clean. Notez que untracked_dir ne figure pas dans la sortie présentée ici. Par défaut, git clean ne fonctionne pas de manière récursive sur les répertoires. Il s'agit d'un autre mécanisme de sécurité pour empêcher toute suppression permanente accidentelle.

 -f or --force

L'option force initie la suppression réelle des fichiers non suivis du répertoire actuel. Elle est nécessaire, sauf si l'option de configuration clean.requireForce est définie sur « false ». Cela ne supprimera pas les dossiers ou fichiers non suivis spécifiés par .gitignore. Exécutons à présent une commande git clean dans notre dépôt de démo.

 $ git clean -f Removing untracked_file

La commande génère une sortie affichant les fichiers supprimés. Comme vous pouvez le voir, untracked_file a été supprimé. Exécuter git status à ce stade ou ls montrera que le fichier untracked_file a été supprimé et est donc introuvable. Par défaut, git clean -f fonctionne sur tous les fichiers non suivis du répertoire actuel. En outre, une valeur peut être transmise avec l'option -f, qui supprimera un fichier spécifique.

 git clean -f  -d include directories

L'option -d indique à git clean que vous souhaitez également supprimer les éventuels répertoires non suivis. Par suivi, les répertoires seront ignorés. Nous pouvons ajouter l'option -d à nos exemples précédents :

 $ git clean -dn Would remove untracked_dir/ $ git clean -df Removing untracked_dir/

Dans cet exemple, nous avons exécuté un « dry run » à l'aide de la combinaison -dn, qui génère une sortie indiquant que untracked_dir doit être supprimé. Nous exécutons ensuite un nettoyage forcé et recevons une sortie indiquant que untracked_dir a été supprimé.

 -x force removal of ignored files

Un schéma de livraison courant consiste à avoir un répertoire de build ou de distribution qui n'est pas commité dans l'index de suivi des répertoires. Le répertoire de build contient des artefacts de build éphémères, qui sont générés à partir du code source commité. Ce répertoire de build est généralement ajouté au fichier .gitignore du répertoire. Il peut être utile de nettoyer également ce répertoire contenant d'autres fichiers non suivis. L'option -x indique à git clean d'inclure également les éventuels fichiers ignorés. Comme avec les précédents appels de git clean, il est recommandé d'exécuter d'abord un « dry run » avant la suppression finale. L'option -x a un effet sur tous les fichiers ignorés, pas seulement sur ceux propres au build de projet. Cela pourrait concerner des fichiers inattendus, comme les fichiers de configuration de l'IDE : ./.idea.

 git clean -xf 

À l'instar de l'option -d, -x peut être transmise et combinée avec d'autres options. Cet exemple montre une combinaison avec -f et supprime les fichiers non suivis du répertoire actuel, ainsi que tout fichier généralement ignoré par Git.

Mode interactif ou git clean interactive

Outre l'exécution de la ligne de commande ad hoc, nous avons jusqu'à présent démontré que git clean dispose d'un mode « interactif » que vous pouvez lancer en transmettant l'option -i. Réexaminons l'exemple de dépôt donné dans l'introduction de ce document. À cet état initial, nous lançons une session de nettoyage interactive.

 $ 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>

Nous avons lancé la session interactive grâce à l'option -d, de sorte qu'elle influencera également notre répertoire untracked_dir. Le mode interactif affichera une invite What now> qui exige d'appliquer une commande aux fichiers non suivis. Les commandes parlent d'elles-mêmes. Nous allons les examiner dans un ordre aléatoire, en commençant par la commande 6: help. Sélectionner la commande 6 expliquera plus en détail les autres commandes :

 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

Est directe et permet de quitter la session interactive.

 1: clean

Les éléments indiqués seront supprimés. Si nous devions exécuter 1: clean à ce stade, untracked_dir/ untracked_file serait supprimé.

 4: ask each

Itère chaque fichier non suivi et affiche une invite Y/N (O/N) en vue d'une suppression. Voici à quoi elle devrait ressembler :

 *** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help What now> 4 Remove untracked_dir/ [y/N]? N Remove untracked_file [y/N]? N
 2: filter by pattern

Affiche une invite supplémentaire qui utilise l'entrée pour filtrer la liste des fichiers non suivis.

 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/

Nous saisissons ici le schéma de caractère générique *_file qui limite la liste de fichiers non suivis à untracked_dir.

 3: select by numbers

À l'instar de la commande 2, la commande 3 affine la liste des noms de fichiers non suivis. La session interactive demandera des chiffres qui correspondent à un nom de fichier non suivi.

 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

Résumé

Pour résumer, git clean permet de supprimer facilement les fichiers non suivis dans le répertoire de travail d'un dépôt. Les fichiers non suivis sont ceux qui se trouvent dans le répertoire du dépôt, mais qui n'ont pas encore été ajoutés à l'index du dépôt grâce à git add. Globalement, l'effet de git clean peut être obtenu grâce à git status et aux outils de suppression natifs des systèmes d'exploitation. git clean peut être utilisée avec git reset pour annuler entièrement touts les ajouts et les commits dans un dépôt.