La commande magique git bisect
permet de retrouver la version
qui a introduit une régression.
Elle est très bien décrite dans la doc,
mais voici un petit résumé rapide.
Recherche manuelle
Initialiser
$ git bisect start
$ git bisect bad # la version courante contient le bug
$ git bisect good v1.2.3 # la version v1.2.3 est ok
ou plus rapidement pour dire la même chose :
$ git bisect start HEAD v1.2.3
Si on sait que le problème vient d’une modification dans le répertoire
src/compute
,
on peut accélérer la recherche en l’indiquant :
$ git bisect start HEAD v1.2.3 -- src/compute
Rechercher
L’outil va ensuite commuter vers une version intermédiaire. On fait le test, puis on indique :
$ git bisect good # la version est ok
ou
$ git bisect bad # la version est boguée
Le processus continue jusqu'à ce que la version coupable soit identifiée.
Terminer
Il faut terminer avec :
$ git bisect reset
On se retrouve alors sur la version de départ.
Pour basculer sur la version coupable :
$ git bisect reset bisect/bad
Pour rester sur la version courante (la dernière testée) :
$ git bisect reset HEAD
Enfin, pour choisir une autre version :
$ git bisect reset <commit>
Recherche automatique
Si on se donne la peine d'écrire un petit script pour déterminer si une version est bonne ou mauvaise, la recherche est automatique.
Le script peut ressembler à ça :
#!/bin/bash
make || exit 125 # on passe les versions qui ne compilent pas
bin/mon_programme -options > tmp.log
if grep Failed tmp.log ; then
exit 1 # le bug est présent dans cette version
else
exit 0 # cette version est ok.
fi
On commence comme précédemment par bisect start
et on indique les versions - la bonne et la mauvaise - de départ,
puis on lance :
$ git bisect run script.sh
Et c’est parti…
Ne pas oublier de terminer comme précédemment par :
$ git bisect reset
Voir aussi :
- Git : déménagement d'un dépôt
- Git rebase : pour diviser un commit
- Git submodule
- Git : pour extraire de l'information
- Git tag : pour nommer des versions
- Git archive : exporter du contenu
- Git subtree : créer un nouveau dépôt à partir du répertoire d'un autre dépôt
- Git : au sujet des pull requests
- Git : les branches
- Git : comment corriger des erreurs
- Git diff : voir les différences
- Git clean : grand nettoyage
- Git : aide mémoire de base
- Afficher un pourcentage dans une page HTML
- VNC : Virtual Network Computing
- Git : déménagement d'un dépôt
- Quelques liens au sujet de l'analyse statique
- Ocaml: mon principal langage de développement
- Disque dur externe
- Les profiles dans Firefox
- Cryptographie et mail sous Android
- Quelques liens au sujet du C
- Git rebase : pour diviser un commit