Annuler des changements

Git Clean

Dans cette section, nous nous concentrerons sur une discussion détaillée concernant la commande git clean. git clean s'apparente en quelque sorte à une commande d'annulation. git clean peut compléter d'autres commandes, comme git reset et git checkout. Alors que ces autres commandes opèrent sur des fichiers précédemment ajoutés à l'index de suivi Git, la commande git clean opère sur des fichiers non trackés. Les fichiers non trackés 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 du dépôt avec la commande git add. Pour mieux démontrer la différence entre les fichiers trackés et non trackés, voyons 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: (utilisez "git rm --cached <fichier>..." pour la désindexation)
new file: tracked_file
Untracked files: (utilisez "git add <fichier>..." pour inclure ce qui sera commité) untracked_dir/ untracked_file

L'exemple crée un nouveau dépôt Git dans le répertoire git_clean_test. Il continue en créant un fichier tracked_file qui est ajouté à l'index Git. De plus, un fichier untracked_file et un répertoire untracked_dir sont créés. L'exemple appelle ensuite git status, qui affiche une sortie précisant l'état interne de Git pour les changements trackés et non trackés. Lorsque le dépôt présente cet état, nous pouvons exécuter la commande git clean pour démontrer l'objectif visé.

$ git clean fatal: clean.requireForce est défini par défaut sur true, et -i, -n et -f ne sont pas attribués ; nettoyage refusé.

À ce stade, exécuter la commande git clean par défaut peut entraîner une erreur irrécupérable. L'exemple ci-dessus l'illustre. Par défaut, Git est généralement configuré pour demander que la commande git clean soit associée à une option « force » pour se lancer. C'est un mécanisme de sécurité important. Une fois exécutée, la commande git clean ne peut pas être annulée. Lorsqu'elle est entièrement exécutée, la commande git clean procédera à une suppression complète du système de fichiers, qui s'apparente à l'exécution de l'utilitaire rm de ligne de commande. Assurez-vous de réellement vouloir supprimer les fichiers non trackés 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 opération.

-n

L'option -n effectuera un « dry run » de git clean. Vous pourrez voir 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 démontrer cette option dans le dépôt de démonstration créé tout à l'heure.

$ git clean -n
Would remove untracked_file

La sortie nous indique que untracked_file sera supprimé quand la commande git clean sera exécutée. Notez que untracked_dir ne figure pas dans la sortie ici. Par défaut, git clean n'opère pas de manière récurrente sur les répertoires. Il s'agit d'un autre mécanisme de sécurité pour empêcher toute suppression permanente accidentelle.

-f ou --force

L'option « force » initie la suppression réelle des fichiers non trackés du répertoire en cours. L'option « force » 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 trackés spécifiés par .gitignore. Exécutons à présent une commande git clean en direct dans notre dépôt de démonstration.

$ git clean -f
Removing untracked_file

La commande générera 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 opèrera sur tous les fichiers non trackés du répertoire actuel. En outre, une valeur <chemin> peut être transmise avec l'option -f qui supprimera un fichier spécifique.

git clean -f <chemin>
-d include directories

The -d option tells git clean that you also want to remove any untracked directories, by default it will ignore directories. We can add the -d option to our previous examples:

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

Here we have executed a 'dry run' using the -dn combination which outputs untracked_dir is up for removal. Then we execute a forced clean, and receive output that untracked_dir is removed.

-x force removal of ignored files

A common software release pattern is to have a build or distribution directory that is not committed to the repositories tracking index. The build directory will contain ephemeral build artifacts that are generated from the committed source code. This build directory is usually added to the repositories .gitignore file. It can be convenient to also clean this directory with other untracked files. The -x option tells git clean to also include any ignored files. As with previous git clean invocations, it is a best practice to execute a 'dry run' first, before the final deletion. The -x option will act on all ignored files, not just project build specific ones. This could be unintended things like ./.idea IDE configuration files.

git clean -xf

Comme l'option -d, -x peut être transmise et composée avec d'autres options. Cet exemple démontre une combinaison avec -f qui supprimera les fichiers non trackés du répertoire courant ainsi que tous les fichiers que Git ignore habituellement.

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. Au cours de cette étape initiale, nous lancerons 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 avec 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 trackés. 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érera chaque fichier non tracké et affichera une invite Y/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

Will display an additional prompt that takes input used to filter the list of untracked files.

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 entrons ici le modèle de caractère générique *_file qui restreint la liste de fichiers non trackés à untracked_dir.

3: select by numbers

À l'instar de la commande 2, la commande 3 affine la liste des noms de fichiers non trackés. La session interactive demandera des numéros qui correspondent à un nom de fichier non tracké.

Les éléments suivants seraient supprimés :
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>>
Les éléments suivants seraient supprimés :
untracked_file
*** Commands ***
1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help

Summary

Pour résumer, git clean permet de supprimer facilement les fichiers non trackés dans le répertoire de travail d'un dépôt. Les fichiers non trackés 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 avec git add. Globalement, l'effet de git clean peut être obtenu avec git status et les 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 d'un dépôt.