L'utilisation git gui blame
est difficile à utiliser dans les scripts, et bien git log -G
que git log --pickaxe
chacun puisse vous montrer quand la définition de la méthode est apparue ou a disparu, je n'ai trouvé aucun moyen de leur faire lister toutes les modifications apportées au corps de votre méthode.
Cependant, vous pouvez utiliser gitattributes
et letextconv
propriété pour reconstituer une solution qui fait exactement cela. Bien que ces fonctionnalités aient été initialement destinées à vous aider à travailler avec des fichiers binaires, elles fonctionnent tout aussi bien ici.
La clé est que Git supprime du fichier toutes les lignes sauf celles qui vous intéressent avant d'effectuer des opérations de comparaison. Alors git log
,git diff
etc. ne verront que la zone que vous intéresse.
Voici les grandes lignes de ce que je fais dans une autre langue; vous pouvez le modifier selon vos propres besoins.
Écrivez un court script shell (ou un autre programme) qui prend un argument - le nom d'un fichier source - et ne produit que la partie intéressante de ce fichier (ou rien si rien de tout cela n'est intéressant). Par exemple, vous pouvez utiliser sed
comme suit:
#!/bin/sh
sed -n -e '/^int my_func(/,/^}/ p' "$1"
Définir un Git textconv
filtre pour votre nouveau script. (Voir la gitattributes
page de manuel pour plus de détails.) Le nom du filtre et l'emplacement de la commande peuvent être tout ce que vous voulez.
$ git config diff.my_filter.textconv /path/to/my_script
Dites à Git d'utiliser ce filtre avant de calculer les différences pour le fichier en question.
$ echo "my_file diff=my_filter" >> .gitattributes
Maintenant, si vous utilisez -G.
(notez le .
) pour lister tous les commits qui produisent des changements visibles lorsque votre filtre est appliqué, vous aurez exactement ces commits qui vous intéressent. Toutes les autres options qui utilisent les routines de diff de Git, telles que--patch
, obtenez également cette vue restreinte.
$ git log -G. --patch my_file
Voilà!
Une amélioration utile que vous voudrez peut-être apporter est que votre script de filtrage prenne un nom de méthode comme premier argument (et le fichier comme deuxième). Cela vous permet de spécifier une nouvelle méthode intéressante simplement en appelantgit config
, plutôt que d'avoir à modifier votre script. Par exemple, vous pourriez dire:
$ git config diff.my_filter.textconv "/path/to/my_command other_func"
Bien sûr, le script de filtrage peut faire tout ce que vous voulez, prendre plus d'arguments ou autre: il y a beaucoup de flexibilité au-delà de ce que j'ai montré ici.