vendredi 27 novembre 2020
Ce billet a été vu pour la première fois sur le blog de Synbioz le 27 November 2020 sous licence CC BY-NC-SA.

Git mailmap ou comment identifier les contributeurs d'un projet

Vous êtes-vous déjà demandé, après avoir lancé un git blame sur un fichier, qui est le collègue qui se cache derrière cet obscur pseudo ? Vous est-il déjà arrivé de pousser un commit avec une mauvaise configuration ou depuis la mauvaise machine ?

❯ git blame README.md
53e6ebfb (Mr Robot 2020-11-03 10:13:42 +0200  1) # Read me
...

Lorsque l’on travaille sur un projet dont le code est versionné avec Git, il est recommandé de définir son nom et son adresse email :

git config user.name "Ada Lovelace"
git config user.email "alovelace@cam.ac.uk"

Ceci peut être fait à l’échelle d’un projet, comme ici, ou de manière globale en ajoutant l’option --global aux commandes ci-dessus. Ce qui en résultera, c’est que vos informations seront stockées dans un fichier ~/.gitconfig, dans votre répertoire personnel donc, plutôt que dans un fichier .gitconfig à la racine du projet. Et pour connaître les valeurs associées à une clé, l’option --get-all est disponible.

❯ git config --local user.email
alovelace@cam.ac.uk

❯ git config --global user.email
alovelace@example.org

❯ git config --get-all user.email
alovelace@example.org
alovelace@cam.ac.uk

Seulement voilà, parfois, par mégarde, on pousse un commit avec la mauvaise configuration et on se retrouve avec ceci dans les logs de Git :

Merge branch 'draft/dont-repeat-yourself' into 'master'

Commit: acfb98ff6bf4743ae9788cb530b1a482bf88fff5
Author: Ada <alovelace@alovelace-cambridge-univ.local>
Date:   2020-07-02 14:32:58 +0200 (il y a 4 mois)

Et évidemment, le temps qu’on s’en rende compte, il n’est plus question de réécrire l’arbre des commits ! Alors que faire ?

Rien. Ce n’est pas si grave, tu peux laisser ça comme ça !
— un lecteur qui a déjà oublié le sujet de l’article

En effet, il n’y a pas péril en la demeure, mais…

❯ git shortlog -sne
   267  Augusta Ada King, Countess of Lovelace <alovelace@example.org>
   ...
   130  Ada Lovelace <alovelace@cam.ac.uk>
   ...
    32  Augusta Ada King <ada.lovelace@example.org>
❯ git blame dont_repeat_yourself.md
...
acfb98ff (Ada Lovelace 1843-07-02 14:32:58 +0200  52)
acfb98ff (Ada Lovelace 1843-07-02 14:32:58 +0200  53)
984e8d96 (alovelace    1843-07-02 14:30:37 +0200  54)
984e8d96 (alovelace    1843-07-02 14:30:37 +0200  55)
...

Mailmap à la rescousse !

Sachez que rien n’est perdu ! Pour pallier cette situation, Git nous offre la possibilité de déclarer un fichier .mailmap dans lequel nous pourrons déclarer le nom et l’adresse email de chaque contributeur.

Il s’agit d’un simple fichier à plat dont voici le format attendu pour chaque ligne :

Prénom Nom <prenom.nom@example.com>   Pseudo <pseudo@example.org>

Il s’agit donc de déclarer les coordonnées attendues, suivies de celles à remplacer. Ici, on voudra donc remplacer toute occurrence de Pseudo <pseudo@example.org> par Prénom Nom <prenom.nom@example.com>.

Il est aussi possible de ne déclarer que la première partie. Cela peut être suffisant, par exemple, quand seul le nom d’un contributeur change d’un commit à l’autre, mais que son adresse email reste la même.

Pour nous assurer que notre fichier .mailmap est pris en compte comme attendu, Git nous met à disposition une petite commande :

❯ git check-mailmap "<pseudo@example.org>"
Prénom Nom <prenom.nom@example.com>

Si l’on reprend les exemples ci-dessus, nous pourrions écrire ce .mailmap :

Ada Lovelace <alovelace@cam.ac.uk> <alovelace@example.org>
Ada Lovelace <alovelace@cam.ac.uk> <ada.lovelace@example.org>

Notez que je n’ai pas précisé le nom associé à l’adresse email à remplacer ! Cela signifie que, peu importe le nom associé à cette adresse, on souhaite utiliser le nom déclaré en début de ligne.

Et nos problèmes sont ainsi résolus !

❯ git shortlog -sne
   429  Ada Lovelace <alovelace@cam.ac.uk>
   ...
❯ git blame dont_repeat_yourself.md
...
acfb98ff (Ada Lovelace 2020-07-02 14:32:58 +0200  52)
acfb98ff (Ada Lovelace 2020-07-02 14:32:58 +0200  53)
984e8d96 (Ada Lovelace 2020-07-02 14:30:37 +0200  54)
984e8d96 (Ada Lovelace 2020-07-02 14:30:37 +0200  55)
...

Voilà, c’était un petit article sans prétention pour vous présenter une fonctionnalité méconnue de Git. J’espère que cette pastille vous a plu ! Et si vous êtes curieux, n’hésitez pas à faire un tour sur la documentation officielle de Git qui traite précisément de ce sujet.