Les commandes Git à exécuter avant de lire le code
(piechowski.io)- Lorsqu’on découvre une nouvelle codebase, analyser l’historique Git pour comprendre la structure du projet et ses zones à risque permet de définir une stratégie d’exploration plus efficace
- Repérer les fichiers les plus souvent modifiés sur l’année écoulée, puis croiser cette information avec la fréquence des bugs pour identifier le code à haut risque
- Examiner la répartition des contributeurs et l’évolution de leur activité afin d’évaluer le bus factor, les lacunes de maintenance et les risques de perte de connaissances
- Suivre le nombre de commits par mois pour observer l’évolution du rythme de développement et de la dynamique de l’équipe, puis évaluer la stabilité des déploiements via la fréquence des revert et hotfix
- Ces cinq commandes constituent des outils concrets pour diagnostiquer rapidement l’état de santé d’un projet avant même d’ouvrir une seule ligne de code
Cinq commandes Git à lancer avant de lire le code
- Lorsqu’on analyse une nouvelle codebase, l’idée est de diagnostiquer l’état de santé du projet à partir de l’historique Git avant même d’ouvrir des fichiers
- L’historique des commits permet de voir qui a construit le projet, où les problèmes se concentrent et à quel point l’équipe déploie de manière stable
-
Qu’est-ce qui change le plus souvent ?
- Commande :
git log --format=format: --name-only --since="1 year ago" | sort | uniq -c | sort -nr | head -20 - Affiche les 20 fichiers les plus modifiés au cours des 12 derniers mois
- Les fichiers en tête sont souvent ceux que l’équipe “n’ose pas toucher” : lorsque forte fréquence de changement (churn) et évitement de responsabilité se combinent, ils deviennent l’un des plus grands facteurs de charge de la codebase
- Selon une étude de Microsoft Research (2005), les indicateurs basés sur la fréquence des changements prédisent mieux les défauts que les indicateurs de complexité
- En croisant les 5 premiers fichiers avec la commande sur la concentration des bugs, on peut identifier comme risque maximal les fichiers souvent modifiés et souvent défaillants
- Commande :
-
Qui a construit ce code ?
- Commande :
git shortlog -sn --no-merges - Classe les contributeurs selon leur nombre de commits
- Si une seule personne dépasse 60 %, il existe un risque de bus factor
- Si le principal contributeur n’a plus été actif au cours des 6 derniers mois, cela peut signaler un vide de maintenance
- Si, sur 30 contributeurs, seuls 3 ont encore été actifs sur la dernière année, cela peut indiquer une rupture de transmission des connaissances due au turnover des développeurs
- En revanche, une équipe qui utilise une stratégie de squash-merge peut voir les informations d’auteur biaisées en faveur de la personne qui fusionne ; il faut donc vérifier la stratégie de merge
- Commande :
-
Où les bugs se concentrent-ils ?
- Commande :
git log -i -E --grep="fix|bug|broken" --name-only --format='' | sort | uniq -c | sort -nr | head -20 - Extrait les 20 principaux fichiers liés aux bugs à partir des commits contenant des mots-clés associés aux corrections
- En comparant cette liste avec celle de la fréquence des changements, on peut identifier comme code à haut risque les fichiers souvent modifiés et souvent cassés
- La précision dépend de la qualité des messages de commit, mais cela reste très utile comme carte approximative de la densité des bugs
- Commande :
-
Le projet accélère-t-il ou stagne-t-il ?
- Commande :
git log --format='%ad' --date=format:'%Y-%m' | sort | uniq -c - Le nombre de commits par mois permet de visualiser la tendance de l’activité
- Un rythme régulier est le signe d’un projet en bonne santé
- Si le nombre de commits est divisé par deux d’un mois à l’autre, cela peut signaler le départ de personnes clés
- Une baisse continue sur 6 à 12 mois suggère une perte d’élan de l’équipe, tandis que des pics périodiques suivis de stagnation évoquent un modèle de release par lots
- Dans un cas réel, un graphique de vélocité des commits a permis à un CTO de reconnaître que “c’était le moment où l’ingénieur senior était parti”
- Ces données ont de la valeur en tant que données d’équipe plutôt que données de code
- Commande :
-
À quelle fréquence l’équipe est-elle en mode urgence ?
- Commande :
git log --oneline --since="1 year ago" | grep -iE 'revert|hotfix|emergency|rollback' - Mesure la fréquence des revert et des hotfix
- Quelques occurrences par an sont normales, mais si cela arrive toutes les deux semaines, c’est un signal de défiance envers le processus de déploiement
- Cela peut révéler des problèmes plus profonds : tests instables, absence d’environnement de staging, procédures de rollback complexes
- Si le résultat est de 0, soit l’équipe est stable, soit les messages de commit sont peu fiables
- Les schémas de crise apparaissent clairement, et leur simple présence permet déjà d’évaluer le niveau de confiance
- Commande :
Conclusion
- Ces cinq commandes peuvent être exécutées en quelques minutes et donnent une direction sur l’endroit où commencer à lire avant même d’ouvrir une seule ligne de code
- Elles permettent, dès le premier jour, de remplacer une exploration au hasard par une analyse structurée du code centrée sur les zones à problème
- Cette démarche correspond à la première heure d’un audit de codebase, avant de déboucher sur une semaine entière d’analyse
1 commentaires
Réactions sur Hacker News
Partage d’exemples, avec Jujutsu, pour remplacer des commandes d’analyse de git
On peut utiliser
jj logpour voir les fichiers les plus modifiés sur l’année écoulée, les principaux contributeurs, les zones où les bugs se concentrent, la vitalité du projet, la fréquence des correctifs urgents, etc.La syntaxe est plus proche d’un langage de programmation que d’un script shell, mais il y a moins d’options à mémoriser
Comme Nix, c’est élégant mais ça ajoute de la complexité
Je l’ai utilisé quelques mois avant de revenir à git, parce que git est familier et disponible partout
Je suis déjà content quand je me souviens de la boucle sur les tableaux en
jq, alors ce genre de syntaxe, ça ne me parle pas du toutjjcomme les commandes git sont trop longues et complexes pour que j’aie envie de les retenirSi je dois les utiliser souvent, je les raccourcirais avec des alias
Par exemple, il existe une bibliothèque de génération de QR code sans mise à jour depuis 10 ans, et elle fonctionne parfaitement
Il m’arrive de me demander s’il faudrait ajouter des commits inutiles juste pour faire plaisir aux bots
C’est pour ça que je préfère les commandes UNIX en pipeline à des outils comme jujutsu
C’est aussi la même logique qui me fait préférer Maven à Gradle
J’ai trouvé amusant que l’auteur parte du principe que les développeurs écrivent de bons messages de commit
En réalité, c’est souvent du niveau de « changed stuff »
Les gens comme moi, qui accordent de l’importance à l’historique des commits, sont minoritaires
Les messages de commit générés par l’IA pourraient beaucoup aider sur ce point
Les développeurs peuvent écrire ce qu’ils veulent dans les commits intermédiaires, puisqu’au final personne ne les lit
Pour les Core, review de PR et explications détaillées sont obligatoires ; pour les Non-Core, on peut expérimenter plus librement
Sur les Core, il arrive que les messages de commit soient 20 fois plus longs que le code ; sur les Non-Core, on est au niveau de « hope this works »
Dans notre entreprise, on l’exige les uns des autres
J’ai essayé ces commandes sur plusieurs bases de code, et les résultats ne reflétaient pas la réalité
Par exemple, dans le résultat de
git shortlog -sn --no-merges, la personne avec le plus de commits avait parfois déjà quitté l’entrepriseAvoir beaucoup de commits ne signifie pas contribuer davantage
On garde les commits trop nombreux sur la branche de feature, puis on fusionne proprement dans la branche principale
Sur une base de code ordinaire, ça produit souvent des résultats peu intéressants
C’est parce que j’ai lancé le projet à partir de zéro, alors qu’aujourd’hui d’autres commitent plus souvent que moi
La remarque selon laquelle les fichiers les plus modifiés seraient ceux que les gens ont peur de toucher m’a paru intéressante
Tirer des conclusions directement à partir du résultat peut au contraire donner l’air naïf
En pratique, ça montre surtout sur quelles fonctionnalités on a travaillé pendant l’année écoulée
Les zones où les deux sont élevées sont les vraies zones à problème
Quand ces zones s’accumulent, on commence à entendre qu’il faudrait « réécrire l’app depuis zéro »
Tout le monde doit les modifier, mais ils sont si gros qu’ils deviennent difficiles à manipuler
J’ai créé dans git un alias summary qui affiche d’un coup le résumé des branches, le nombre de commits, le nombre d’auteurs, le nombre de fichiers, etc.
L’idée vient de GitAlias/gitalias
.gitconfig; faire simplement un script git-summary me semblerait plus simplelog-of-count-and-emailIl faudrait ajouter une frontière de mot (
\b) dans la regexPar exemple, le mot « bug » dans « debugger » peut produire de faux résultats
La version corrigée ressemble à ceci
git log -i -E --grep="\b(fix|fixed|fixes|bug|broken)\b" ...\bn’est pas pris en charge, donc il faut utiliser l’option d’expression régulière Perl-Pau lieu de-EOn peut alors écrire
git log -i -P --grep="\b(...)\b"Sans squash-merge, la personne qui a le plus de commits peut au contraire être le développeur le plus brouillon
J’en ai connu un comme ça : il modifiait sans arrêt le même fichier, avant d’être finalement licencié
Le squash a l’avantage de masquer ce genre de problème
Les statistiques brutes de nombre de commits sont difficiles à croire
Certains ne commitent que du code parfaitement testé, d’autres commitent très souvent ligne par ligne
La valeur d’un seul commit peut varier d’un facteur 100 selon les personnes
Le taux de variation a plus de sens que la valeur absolue
Cette approche de l’analyse rappelle « Your Code as a Crime Scene » d’Adam Tornhill
Lien vers l’article original
Cela évoque aussi le concept de Developer’s Legacy Index
L’article aurait gagné à montrer directement le résultat de chaque commande
Des exemples de sortie auraient été plus convaincants que de simples explications