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
- Git
Les options pour ignorer des commits sont apparues dans git 2.23 (notes de version).
Les applications se basant sur les commandes git devraient supporter nativement cette fonctionnalité, à supposer qu’elles utilisent une version de git compatible. - Github
Encore en discussion
https://github.com/github/feedback/discussions/5033 - Gitlab
Encore en discussion
https://gitlab.com/gitlab-org/gitaly/-/merge_requests/4177 - VSCode
Fonctionne lorsque l’option de configuration est renseignée dans `.gitconfig`.
https://github.com/gitkraken/vscode-gitlens/issues/947#issuecomment-583703079 - PHPStorm
Fonctionne lorsque le fichier est renseigné viagit config
.
Crédits images : Logo Git par Jason Long ©, photo de l’ordinateur : © New Data Services sur Unsplash