Plusieurs manières
Dans le chapitre précédent, je t’avais expliqué comment faire ton premier commit et comment ajouter des fichiers dans le stage (l’index) pour pouvoir les commiter.
Maintenant, je vais te montrer différentes manières d’ajouter des fichiers à l’index en fonction de certains cas de figure, qui sont ceux que je rencontre le plus souvent dans mon métier de web développeur.
Contexte de départ
Histoire de partir de la même base, j’ai créé un dossier git sur mon bureau dans lequel j’ai initialisé un nouveau dépôt. Dans ce dossier, j’ai placé les fichiers de WordPress 5.2.
En exécutant la commande git status, voici ce que j’obtiens.
Pour chacune des commandes que je vais expliquer dans cet article, je repartirai de cet état.
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.php
license.txt
readme.html
wp-activate.php
wp-admin/
wp-blog-header.php
wp-comments-post.php
wp-config-sample.php
wp-content/
wp-cron.php
wp-includes/
wp-links-opml.php
wp-load.php
wp-login.php
wp-mail.php
wp-settings.php
wp-signup.php
wp-trackback.php
xmlrpc.php
nothing added to commit but untracked files present (use "git add" to track)
Ajout d'un fichier
La première façon d’ajouter des fichiers à l’index, c’est tout simplement de donner le chemin du fichier cible, voici deux exemples.
git add readme.html
git add wp-content/themes/twentynineteen/index.php
Et si je fais un git status, je peux voir que les deux fichiers ont bien été insérés dans l’index.
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: readme.html
new file: wp-content/themes/twentynineteen/index.php
Il est également possible d’ajouter plusieurs fichiers en même temps en les séparant par un espace.
git add index.php wp-cron.php
J’utilise parfois cette méthode quand un développeur envoie un nouveau fichier sur le serveur sans passer par git (et à ce moment-là, je cogne) ou lorsqu’un correctif est directement appliqué sur le serveur de production.
Ajout de tout
Et voici la méthode de fainéant par excellence ! En plus d’être rapide à taper, elle ajoute tous les fichiers à l’index (à partir du moment où elle est exécutée à la racine).
Il est également possible d’utiliser le symbole étoile pour avoir le même résultat.
Alors il existe quand même une différence entre les deux symboles. La commande avec l’étoile, permet d’ajouter tous les fichiers, cependant elle n’ajoutera pas ceux suivis puis supprimés.
Rien de mieux qu’un petit exemple !
# j'ajoute index.php à staging
git add index.php
# je commit le fichier
git commit -m "sauvegarde de l'index"
# puis je le supprime
rm index.php
# j'ajoute tous les fichiers avec le symbole étoile
git add *
# je commit l'ensemble des fichiers
git commit -m "sauvegarde de tous les fichiers"
Si maintenant je fais un coup de git status, je peux voir qu’effectivement Git n’a pas repris ce fichier.
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: index.php
Petite précision avec les symboles : ils sont bien sûr relatifs à l’endroit dans lequel tu te trouves (le path). Pour faire un ajout de tout ce qu’il y a dans le dossier wp-content/, je peux procéder comme ça.
# Je vais dans le dossier wp-content
cd wp-content
# Je fais le add .
git add .
Ajout par motif
La troisième méthode que je vais te présenter est sans doute celle que j’utilise le plus souvent. C’est l’ajout de fichiers par motif en utilisant le symbole *. Je vais te montrer deux exemples vraiment très pratiques que tu vas comprendre très facilement.
L’exemple ci-dessous me permet uniquement d’ajouter les fichiers .php qui se trouvent à la racine du WordPress.
P.S. Pour chaque exemple, je réinitialiserais le dépôt.
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: index.php
new file: wp-activate.php
new file: wp-blog-header.php
new file: wp-comments-post.php
new file: wp-config-sample.php
new file: wp-cron.php
new file: wp-links-opml.php
new file: wp-load.php
new file: wp-login.php
new file: wp-mail.php
new file: wp-settings.php
new file: wp-signup.php
new file: wp-trackback.php
new file: xmlrpc.php
Le symbole * permet de désigner tous les fichiers d’un répertoire (attention pas les fichiers des répertoires enfants). Si j’ajoute juste après « .php », le système comprend qu’il doit choisir tous les fichiers du répertoire dont le nom finit par .php.
Pour le deuxième exemple de cette méthode, ce que je vais faire, c’est sélectionner uniquement les fichiers qui commencent par « wp-« et qui se terminent par « .php » ! Tu l’auras sans doute deviné assez facilement, il est possible de mettre le symbole étoile n’importe où dans la chaine.
Et si tu regardes attentivement, tu peux voir que cette fois-ci index.php et xmlrpc.php n’ont pas été repris dans l’index car ils ne respectent pas le motif.
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: wp-activate.php
new file: wp-blog-header.php
new file: wp-comments-post.php
new file: wp-config-sample.php
new file: wp-cron.php
new file: wp-links-opml.php
new file: wp-load.php
new file: wp-login.php
new file: wp-mail.php
new file: wp-settings.php
new file: wp-signup.php
new file: wp-trackback.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.php
license.txt
readme.html
wp-admin/
wp-content/
wp-includes/
xmlrpc.php
Git add update
La dernière méthode quant à elle est vraiment très pratique. C’est la même commande que pour tout ajouter mais avec l’option -u (update/mise à jour). On va pouvoir lui dire de ne prendre que les fichiers déjà suivis.
La première chose est de suivre au minimum un fichier. Donc j’ajoute l’index.php et je fais un petit commit, ensuite je fais une toute petite modification dans ce même fichier et je donne un coup de git status.
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: index.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
license.txt
readme.html
wp-activate.php
wp-admin/
wp-blog-header.php
wp-comments-post.php
wp-config-sample.php
wp-content/
wp-cron.php
wp-includes/
wp-links-opml.php
wp-load.php
wp-login.php
wp-mail.php
wp-settings.php
wp-signup.php
wp-trackback.php
xmlrpc.php
Git m’indique que le fichier index.php contient des modifications. Et je sais qu’il est suivi car il n’apparait pas dans Untracked files.
Maintenant, si je fais un git add . avec l’option update, tu vas voir qu’il va uniquement ajouter le fichier index.php car c’est le seul qui est suivi.
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: index.php
Untracked files:
(use "git add <file>..." to include in what will be committed)
license.txt
readme.html
wp-activate.php
wp-admin/
wp-blog-header.php
wp-comments-post.php
wp-config-sample.php
wp-content/
wp-cron.php
wp-includes/
wp-links-opml.php
wp-load.php
wp-login.php
wp-mail.php
wp-settings.php
wp-signup.php
wp-trackback.php
xmlrpc.php
C’est une commande très utile quand tu travailles sur un CMS. Dans WordPress par exemple, les fichiers noyau, plugins et le thème sont séparés et quand tu fais une mise à jour, tu peux facilement identifier les nouveaux fichiers qui ont été ajoutés grâce à cette méthode.
--dry-run
Il existe l’option –dry-run qui permet de faire une simulation et d’avoir l’aperçu de ce Git va ajouter à l’index, mais sans réellement l’y ajouter.
Voici ce qui va être affiché. Grâce à cela, tu vas pouvoir inspecter finement ce que Git va ajouter à l’index et adapter ta commande si cela ne correspond pas à ce que tu souhaites faire.
add 'wp-load.php'
add 'wp-login.php'
add 'wp-mail.php'
add 'wp-settings.php'
add 'wp-signup.php'
add 'wp-trackback.php'
add 'xmlrpc.php'
"Add bientot"
Voilà tu sais maintenant ajouter des fichiers à l’index comme un expert. Avec de la pratique, tu verras que c’est quelque chose qui est assez instinctif avec ce qui ce fait déjà en ligne de commande. Il y a quelques subtilités à connaître au début, et tu as toujours la commande git status pour savoir où tu en es.
16/03/2020
Yann Vangampelaere - nouslesdevs -