Git et le formatage de code

Il arrive que l’on ait à formater du code “en masse”, par exemple sur d’anciens projets pour lesquels les conventions ont changé au fil du temps.
C’est maintenant une tâche aisée grâce à des outils comme CS Fixer en PHP ou Prettier en JavaScript.

Pour conserver un historique git propre, on préfèrera committer les changement stylistiques dans des commits dédiés, afin qu’ils ne se confondent pas avec un ajout de fonctionnalité par exemple.

Néanmoins, cela posera tout de même problème à l’usage de git blame.
Un formatage automatique touchant potentiellement chaque ligne de chaque fichier, il pourrait apparaitre à chaque ligne du blame alors qu’il n’a pas d’intérêt fonctionnel.

Exemple d’historique

Prenons un exemple simple en JavaScript.
Nous allons créer un fichier user.js et le modifier quelques fois.

Commit aaa000 "Ajout de l'utilisateur"

+const user = {
+    name: 'Micheline'
+}

Commit bbb111 "Renommage de l'utilisateur"

const user = {
-    name: 'Micheline'
+    name: 'Jean-Michel'
}

Commit ccc222 "Formatage"

const user = {
-    name: 'Jean-Michel'
-}
+  name: 'Jean-Michel'
+};

Maintenant, voici ce que la commande git blame user.js renvoie :

aaa000 const user = {
ccc222   name: 'Jean-Michel'
ccc222 };

On voit que les dernières lignes sont “polluées” par le formatage, et nous empêchent de voir facilement les commits pertinents.

Exclure des commits lors du blame

Il existe une option --ignore-revs pour git blame permettant d’ignorer certains commits.

Par exemple, dans notre cas, nous pouvons ignorer le formatage avec la commande git blame --ignore-rev ccc222 user.js :

aaa000 const user = {
bbb111   name: 'Jean-Michel'
aaa000 };

Le commit de formatage n’est plus remonté et on ne voit plus que les commits pertinents.
Cette méthode fonctionne très bien pour un usage occasionnel, mais oblige à renseigner les commits manuellement.

Exclure des commits par défaut

Pour simplifier l’usage, il existe une option de configuration git pour fournir une liste de commits à exclure par défaut.
On crée d’abord un fichier .git-blame-ignore-revs à la racine du projet pour spécifier la liste de commits à ignorer :

ccc222 # Formatage

Ensuite, on signale l’existence de ce fichier à git

  • soit avec la commande git config blame.ignoreRevsFile .git-blame-ignore-revs
  • soit dans le fichier `.gitconfig` à la racine du projet
    blame.ignoreRevsFile=.git-blame-ignore-revs
    

Dorénavant, les commits renseignés dans .git-blame-ignore-revs seront automatiquement ignorés lors du blame sans avoir à les renseigner en arguments de git blame.

Support

Crédits images : Logo Git par Jason Long ©, photo de l’ordinateur : © New Data Services sur Unsplash