Existe-t-il un moyen d'obtenir que git vous donne un journal de validation pour les validations qui ont touché une ligne particulière dans un fichier?
Comme git blame
, mais git blame
vous montrera le DERNIER commit qui a touché une ligne particulière.
J'aimerais vraiment obtenir un journal similaire, pas la liste des validations n'importe où dans le fichier, mais uniquement les validations qui ont touché une ligne particulière.
Réponses:
Voir aussi Git: découvrez quels commits ont touché une gamme de lignes .
Depuis Git 1.8.4 ,
git log
il-L
faut voir l'évolution d'une gamme de lignes.Par exemple, supposons que vous regardiez
git blame
la sortie de. Ici-L 150,+11
signifie "ne regardez que les lignes 150 à 150 + 11":Et vous voulez connaître l'historique de ce qui est maintenant la ligne 155.
Ensuite, utilisez
git log
. Ici,-L 155,155:git-web--browse.sh
signifie "retracer l'évolution des lignes 155 à 155 dans le fichier nommégit-web--browse.sh
".la source
git log commitA-hash -L 155,155:file-name
?Vous pouvez obtenir un ensemble de validations en utilisant pioche.
Cela vous donnera toutes les validations qui ont affecté ce texte dans ce fichier. Si le fichier a été renommé à un moment donné, vous pouvez ajouter --follow-parent.
Si vous souhaitez inspecter les validations à chacune de ces modifications, vous pouvez diriger ce résultat vers git show:
la source
git log -S'the previous version of the line'
et ainsi de suite, exactement comme vous finiriez par le faire avecgit blame -L
. Et ce sera beaucoup plus lent que celagit blame
, car il doit chercher le texte partout, pas seulement à l'endroit donné.Essayez d'utiliser la commande ci-dessous implémentée dans Git 1.8.4.
Donc, dans votre cas
upperLimit
etlowerLimit
est touchéline_number
Plus d'informations - https://www.techpurohit.com/list-some-useful-git-commands
la source
--pretty=short
est ignoré lors de l'utilisation-L
. Veuillez corrigerUn moyen extrêmement simple de le faire est d'utiliser vim-fugitive . Ouvrez simplement le fichier dans vim, sélectionnez la ou les lignes que vous souhaitez utiliser
V
, puis entrezVous pouvez maintenant utiliser
:cnext
et:cprev
pour voir toutes les révisions du fichier où cette ligne est modifiée. À tout moment, entrez:Gblame
pour voir les informations sur le sha, l'auteur et la date.la source
Simplifier la réponse de @ matt -
git blame -L14,15 -- <file_path>
Ici, vous obtiendrez un blâme pour une ligne
14 to 15
.Puisque l'
-L
option attend enRange
tant que paramètre, nous ne pouvons pas obtenir unBlame
pour une seule ligne en utilisant l'-L
option` .Référence
la source
Je ne crois pas qu'il y ait quelque chose de intégré à cela. Cela est rendu difficile par le fait qu'il est rare qu'une seule ligne change plusieurs fois sans que le reste du fichier ne change considérablement aussi, vous aurez donc tendance à finir avec des numéros de ligne changeant beaucoup.
Si vous avez la chance que la ligne ait toujours une caractéristique d'identification, par exemple une affectation à une variable dont le nom n'a jamais changé, vous pouvez utiliser le choix d'expression régulière pour
git blame -L
. Par exemple:Mais cela ne trouve que la première correspondance pour cette expression régulière, donc si vous n'avez pas un bon moyen de faire correspondre la ligne, ce n'est pas trop utile.
Vous pourriez pirater quelque chose, je suppose. Je n'ai pas le temps d'écrire du code pour l'instant, mais ... quelque chose dans ce sens. Courez
git blame -n -L $n,$n $file
. Le premier champ est le commit précédent touché, et le deuxième champ est le numéro de ligne dans ce commit, car il aurait pu changer. Saisissez-les et exécutezgit blame -n $n,$n $commit^ $file
, c'est-à-dire la même chose à partir de la validation avant la dernière modification du fichier.(Notez que cela vous échouera si le dernier commit qui a changé la ligne était un commit de fusion. La principale façon que cela pourrait se produire si la ligne était modifiée dans le cadre d'une résolution de conflit de fusion.)
Edit: je suis tombé sur ce message de la liste de diffusion de mars 2011 aujourd'hui, qui le mentionne
tig
etgit gui
possède une fonctionnalité qui vous aidera à le faire. Il semble que la fonctionnalité ait été envisagée, mais pas terminée, pour git lui-même.la source
Cela nécessitera
git blame
que chaque révision significative montre la ligne$LINE
de fichier$FILE
:Comme d'habitude, le blâme indique le numéro de révision au début de chaque ligne. Vous pouvez ajouter
pour obtenir des résultats agrégés, quelque chose comme une liste de commits qui ont changé cette ligne. (Pas tout à fait, si le code uniquement a été déplacé, cela peut afficher le même ID de validation deux fois pour différents contenus de la ligne. Pour une analyse plus détaillée, vous devez effectuer une comparaison retardée des
git blame
résultats pour les validations adjacentes. )la source
Voici une solution qui définit un alias git, vous pourrez donc l'utiliser comme ça:
Exemple de sortie:
Vous pouvez définir l'alias dans votre .gitconfig ou simplement exécuter la commande suivante
Il s'agit d'un laid à une ligne, voici donc une fonction bash équivalente désobscurcie:
La solution de pioche ( git log --pickaxe-regex -S'REGEX ' ) ne vous donnera que des ajouts / suppressions de lignes, pas les autres altérations de la ligne contenant l'expression régulière.
Une limitation de cette solution est que git blame ne renvoie que la 1ère correspondance REGEX, donc si plusieurs correspondances existent, la récursivité peut "sauter" pour suivre une autre ligne. Assurez-vous de vérifier la sortie de l'historique complet pour repérer ces «sauts», puis réparez votre REGEX pour ignorer les lignes parasites.
Enfin, voici une version alternative qui exécute git show sur chaque commit pour obtenir la diff complète:
la source
Vous pouvez mélanger
git blame
etgit log
commander pour récupérer le résumé de chaque commit dans la commande git blame et les ajouter. Quelque chose comme le script bash + awk suivant. Il ajoute le résumé de la validation sous forme de commentaire de code en ligne.En une seule ligne:
la source
Dans mon cas, le numéro de ligne a beaucoup changé au fil du temps. J'étais également sur git 1.8.3 qui ne supporte pas l'expression régulière dans "git blame -L". (RHEL7 a toujours 1.8.3)
Bon mot:
Cela peut bien sûr être transformé en script ou en fonction.
la source