122 votes

Git - Comment afficher l'historique des modifications d'une méthode / fonction?

J'ai donc trouvé la question de savoir comment afficher l'historique des modifications d'un fichier, mais le changement de l'histoire de ce fichier est énorme et je suis vraiment intéressé seulement par les changements de méthode particulière. Alors serait-il possible de voir l'historique des modifications pour seulement une méthode particulière?

Je sais que cela nécessiterait git d'analyser le code et que l'analyse serait différente pour les différentes langues, mais de la méthode/de déclarations de fonctions très similaires dans la plupart des langues, alors j'ai pensé que peut-être quelqu'un a mis en place cette fonctionnalité.

La langue que je suis en train de travailler avec Objective-C et le SCM j'utilise actuellement est git, mais je serais intéressé de savoir si cette fonctionnalité existe pour tout SCM/langue.

17voto

Paul Whittaker Points 922

À l'aide de git gui blame est difficile de faire usage de scripts, et, alors que l' git log -G et git log --pickaxe peuvent vous montrer lors de la définition de la méthode est apparue ou a disparu, je n'ai trouvé aucun moyen de faire la liste de toutes les modifications apportées à l'organisme de votre méthode.

Toutefois, vous pouvez utiliser gitattributes et de la textconv de la propriété à une solution qui ne fait que cela. Bien que ces caractéristiques ont été à l'origine destiné à vous aider à travailler avec les fichiers binaires, ils fonctionnent tout aussi bien ici.

La clé est d'avoir Git supprimer à partir du fichier de toutes les lignes sauf celles qui vous intéressent, avant de faire toute la diff des opérations. Ensuite, git log, git diff, etc. ne peut voir que la zone qui vous intéresse.

Voici les grandes lignes de ce que je fais dans une autre langue; vous pouvez l'adapter à vos propres besoins.

  • Écrire un petit script (ou un autre programme) qui prend un argument, à savoir le nom d'un fichier source -- et sorties uniquement la partie intéressante de ce fichier (ou rien si rien de tout cela 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 l' gitattributes page de manuel pour plus de détails.) Le nom du filtre et de l'emplacement de la commande peut être quelque chose que vous aimez.

    $ git config diff.my_filter.textconv /path/to/my_script
    
  • Indiquer à Git pour utiliser ce filtre avant de calculer les diffs pour le fichier en question.

    $ echo "my_file diff=my_filter" >> .gitattributes
    
  • Maintenant, si vous utilisez -G. (note de l' .) à la liste de tous les commits qui produisent des changements visibles lorsque votre filtre est appliqué, vous aurez exactement les commits qui vous intéresse. Toutes les autres options que l'utilisation de Git est diff routines, comme --patch, sera également obtenir cette vue restreinte.

    $ git log -G. --patch my_file
    
  • Voilà!

Une amélioration utile que vous pourriez faire est d'avoir votre filtre script de prendre un nom de méthode en tant que premier argument (et le fichier pour la seconde). Ceci vous permet de spécifier une nouvelle méthode de d'intérêt, en appelant git 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 filtre script peut faire ce que vous voulez, prendre plus d'arguments, ou quoi que ce soit: il y a beaucoup de flexibilité au-delà de ce que j'ai montré ici.

13voto

lht Points 130

Le journal git a une option '-G' qui pourrait être utilisée pour trouver toutes les différences.

-G Rechercher les différences dont la ligne ajoutée ou supprimée correspond à la donnée.

Donnez-lui simplement une expression régulière du nom de la fonction qui vous tient à cœur. Par exemple,

 $ git log --oneline -G'^int commit_tree'
40d52ff make commit_tree a library function
81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory
7b9c0a6 git-commit-tree: make it usable from other builtins
 

13voto

badp Points 5036

La chose la plus proche que vous pouvez faire est de déterminer la position de votre fonction dans le fichier (par exemple, disons que votre fonction i_am_buggy est à lignes 241-263 d' foo/bar.c), puis de lancer quelque chose à l'effet de:

git log -p -L 200,300:foo/bar.c

Cela va ouvrir moins (ou un équivalent pager). Maintenant, vous pouvez taper dans /i_am_buggy (ou votre téléavertisseur équivalent) et de commencer à marcher à travers les changements.

Cela pourrait même travail, en fonction de votre style de code:

git log -p -L /int i_am_buggy\(/,+30:foo/bar.c

Cela limite la recherche à partir de la première frappe de cette regex (idéalement votre déclaration de fonction) à trente lignes par la suite. La fin argument peut aussi être une expression rationnelle, bien que la détection de que avec regexp est une iffier proposition.

2voto

Will Points 30630

git blame vous indique qui a modifié en dernier chaque ligne du fichier; vous pouvez spécifier les lignes à examiner afin d'éviter d'avoir l'historique des lignes en dehors de votre fonction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X