git log -G<regex> -p
est un merveilleux outil pour rechercher dans l'historique d'une base de code les modifications qui correspondent au modèle spécifié. Cependant, il peut être écrasant de localiser le morceau approprié dans la sortie diff / patch dans une mer de mecs pour la plupart non pertinents.
Il est bien sûr possible de rechercher la sortie de git log
la chaîne / expression originale, mais cela ne fait pas grand-chose pour réduire le bruit visuel et la distraction de nombreux changements non liés.
En lisant la suite git log
, je vois qu'il y a le --pickaxe-all
, qui est l'exact opposé de ce que je veux: il élargit la sortie (à l'ensemble des modifications), alors que je veux le limiter (au morceau spécifique).
Essentiellement, je cherche un moyen d'analyser "intelligemment" le diff / patch en morceaux individuels, puis d'exécuter une recherche sur chaque morceau (en ciblant uniquement les lignes modifiées), de supprimer les morceaux qui ne correspondent pas et de sortir ceux qui font.
Existe-t-il un outil tel que je le décris? Existe-t-il une meilleure approche pour obtenir les mecs correspondants / affectés?
Quelques recherches initiales que j'ai faites ...
S'il était possible de faire
grep
la sortie diff / patch et de rendre les valeurs des options de contexte dynamiques - disons, via des regexps au lieu du nombre de lignes - cela pourrait suffire. Maisgrep
n'est pas exactement construit de cette façon (et je ne demande pas nécessairement cette fonctionnalité).J'ai trouvé la suite de patchutils , qui semblait initialement convenir à mes besoins. Mais après avoir lu ses
man
pages, les outils ne semblent pas gérer les mecs correspondants basés sur des expressions régulières. (Ils peuvent accepter une liste de mecs, cependant ...)J'ai finalement rencontré splitpatch.rb , qui semble bien gérer l'analyse du correctif, mais il devrait être considérablement augmenté pour gérer la lecture des correctifs via
stdin
, faire correspondre les morceaux souhaités, puis produire les morceaux.
Réponses:
ici /programming//a/35434714/5305907 est décrit un moyen de faire ce que vous cherchez. effectivement:
git diff -U1 | grepdiff 'console' --output-matching=hunk
Il montre uniquement les mecs qui correspondent à la chaîne "console" donnée.
la source
grepdiff
est fondamentalement ce que je veux; j'ai dû manquer son option de correspondance de morceau! cependant ... les informations de commit git sont suppriméesgrepdiff
, donc une fois que vous avez localisé le morceau approprié, vous devez deviner le commit sha de l'objet / blob sha dans l'en-tête diff - une opération assez coûteuse. (voir stackoverflow.com/a/223890/2284440 ) ce serait quelque chose commegit find-object SHA --reverse | head -1 | cut -c 1-7 | { read sha ; git log -1 $sha; }
grepdiff
qui est plus simple en termes d'arguments acceptés. notez que lorsque le morceau correspondant est le dernier morceau d'un diff, il inclut incorrectement l'en-tête git commit du commit suivant - quelque chose qui m'a complètement dérouté jusqu'à ce que je réalise ce qui se passe!Pas exactement ce que vous demandez, mais le mode d'ajout interactif est une façon de parcourir les mecs. Cela vous oblige à vérifier le commit après le patch qui vous intéresse
puis revenir une étape de plus dans le VCS, mais pas dans le répertoire de travail
(À ce stade, la différence entre l'index et le répertoire de travail correspondra au patch qui vous intéresse.)
Vous pouvez maintenant exécuter
git add -p
. Cela lancera une session interactive qui a une/
option, qui vous permet de localiser des morceaux dans lesquels une ligne correspond à une expression régulière. Particulièrement utile si vous souhaitez réellement traiter ces correctifs (par exemple, préparer une sélection partielle).Malheureusement, au moins en ce moment, la
/
commandeadd -p
ne fonctionne que dans un seul fichier, vous devrez donc peut-être ignorer plusieurs fichiers non pertinents.la source
Sur la base de la réponse ci-dessus de @nagu et des autres réponses liées, j'ai pu
git log -G
afficher uniquement les mecs pertinents.Créez d'abord un script quelque part dans votre $ PATH avec ce contenu:
Appelez
git log -G
et dites à Git d'utiliser lepickaxe-diff
script comme pilote de diff externe:Cela utilisera le script pickaxe-diff juste pour générer les différences, donc le reste de la
git log
sortie (hachage de validation, message, etc.) ne sera pas modifié.Avertissement
La façon dont fonctionne la pioche Git est qu'elle limite la sortie aux fichiers dont les mecs modifient la chaîne / l'expression régulière donnée. Cela signifie que si un autre morceau de ces fichiers contient également la chaîne de recherche / l'expression régulière, mais ne la modifie pas, elle sera toujours affichée avec le script ci-dessus. Il s'agit d'une limitation de grepdiff. Il y a une demande d'ouverture ouverte au projet
--only-matching
patchutils pour ajouter un indicateur à grepdiff, qui fournirait les fonctionnalités nécessaires pour filtrer correctement ces morceaux.J'ai fait une récapitulation de ma solution dans cet essentiel .
la source