Afficher uniquement les hunks pertinents d'un diff / patch basé sur une expression rationnelle

git log -G<regex> -p est un outil formidable pour searchr dans l'historique d'une base de code les modifications qui correspondent au model spécifié. Cependant, il peut être accablant de localiser le morceau pertinent dans la sortie diff / patch dans une mer d'hunks essentiellement non pertinents.

Il est bien sûr possible de searchr la sortie de git log pour la string / regex d'origine, mais cela ne fait pas grand chose pour réduire le bruit visuel et la distraction de nombreux changements sans rapport.

En lisant git log , je vois qu'il y a le --pickaxe-all , ce qui est exactement le contraire de ce que je veux: il élargit la sortie (à l'set du changeset), alors que je veux le limiter (au morceau spécifique).

Essentiellement, je cherche un moyen d'parsingr «intelligemment» le diff / patch en hunks individuels, puis d'effectuer une search sur chaque segment (en ciblant uniquement les lignes modifiées), de supprimer les hunks qui ne correspondent pas et de produire celles cela fait.

Est-ce qu'un outil tel que je décris existe? Y a-t-il une meilleure approche pour get les hunks appariés / affectés?

Quelques searchs initiales que j'ai faites …

  • S'il était possible de grep la sortie diff / patch et de rendre dynamics les valeurs de l'option de context, par exemple, via les expressions rationnelles plutôt que par le nombre de lignes, cela pourrait suffire. Mais grep n'est pas exactement construit de cette façon (ni je request nécessairement cette fonctionnalité).

  • J'ai trouvé la suite patchutils , qui ressemblait initialement à ça pourrait convenir à mes besoins. Mais après avoir lu ses pages de man , les outils ne semblent pas gérer les hunks correspondants basés sur les expressions rationnelles. (Ils peuvent accepter une list de mecs, bien que …)

  • Je suis finalement tombé sur splitpatch.rb , qui semble gérer l'parsing du correctif, mais il aurait besoin d'être considérablement augmenté pour gérer les patchs de lecture via stdin , en faisant correspondre les hunks souhaités, puis en sortant les hunks.

ici https://stackoverflow.com/a/35434714/5305907 est décrit une façon de faire ce que vous searchz. efficacement:

git diff -U1 | grepdiff 'console' --output-matching=hunk

Il montre seulement les hunks qui correspondent à la string donnée "console".

Pas exactement ce que vous requestz, mais une façon de grep à travers des hunks est le mode interactif-add. Cela vous oblige à vérifier le commit après le patch qui vous intéresse

 git checkout COMMIT_ID 

puis revenir en arrière dans le VCS, mais pas dans le directory de travail

 git reset --soft HEAD^ 

(À ce stade, la différence entre l'index et le directory de travail correspondra au patch qui vous intéresse.)

Vous pouvez maintenant exécuter git add -p . Cela va lancer une session interactive qui a une option / , qui vous permet de localiser des hunks dans lesquels une ligne correspond à une regex. Particulièrement utile si vous souhaitez réellement traiter ces patches (par exemple, préparer un cerisier partiel).

Malheureusement, au less en ce moment, la command / dans add -p ne fonctionne que dans un seul file, vous devez donc sauter plusieurs files non pertinents.