111 votes

Comment grep le git diff ?

Existe-t-il un moyen d'afficher le git-diff filtré par un motif donné.

Quelque chose comme

git grepdiff pattern

changed file
+++ some sentence with pattern
changed file 2
--- some other pattern

Malheureusement, la solution la plus simple n'est pas suffisante.

git diff | grep pattern 

+++ some sentence with pattern
--- some other pattern
# not an option as doesn't put the filename close to the match

J'ai trouvé une solution de contournement en utilisant awk.

git diff | awk "/\+\+\+/{f = \$2}; /PATTERN/ {print f \$0} "

Mais j'aimerais bien savoir s'il existe une commande pour cela.

136voto

CharlesB Points 27070

Pas sûr, mais ce n'est pas le cas git diff -G <regex> drapeau OK ?

-G < regex>

Look for differences whose added or removed line matches the given <regex>.

19voto

robinst Points 9249

Avez-vous essayé git diff -S<string> o git diff -G".*string.*" ? Notez qu'ils ne sont pas équivalents, voir la documentation sur la pioche pour ce que -S fait.

12voto

robinst Points 9249

Une autre possibilité serait de visualiser l'ensemble du diff et de rechercher la sortie en utilisant la méthode normale less commandes (type / et ensuite le motif).

Lorsque vous avez less configuré pour montrer quelques lignes avant le match en utilisant --jump-target=N c'est très utile. Essayez-le comme ça :

PAGER="/usr/bin/less --jump-target=10" git diff

Cela signifie que la correspondance devrait être affichée à la ligne 10 (montre 9 lignes du contexte ci-dessus), ce qui peut être suffisant pour voir également le nom du fichier.

Vous pouvez aussi utiliser par exemple --jump-target=.5 pour qu'il positionne le match au milieu de l'écran.

7voto

chelmertz Points 8774

Utilizo git log -p qui ouvre moins (configurable, cependant), qui à son tour peut être recherché avec / . Il y a aussi git log -S <searchword> .

4voto

Hazzard17 Points 393

Je pense que votre approche de "grep" diff est la meilleure solution de contournement.

Vous pouvez améliorer votre script awk en utilisant sed :

colored="(^[\[[0-9;]*[a-zA-Z])"
marker="^$colored+diff"
pattern="^$colored+.*(\+|\-).*PATTERN"
git diff --color | sed -rn -e "/$marker/! H; /$marker/ ba; $ ba; b; :a; x; /$pattern/ p"
  • colored : regex pour correspondre aux lignes colorées terminales
  • marker : marqueur pour faire correspondre la division des différents diff hunks, lignes commençant par "diff" coloré
  • pattern : motif à rechercher, lignes commençant par un "+" ou un "-" coloré et contenant "PATTERN".

Ceci imprimera les diffs complets, avec les PATTERNs ajoutés ou supprimés, tout en conservant une sortie colorée utile.

Notez que ^[ en colored doit être réel, littéral ^[ . Vous pouvez les taper dans bash en appuyant sur Ctrl + V , Ctrl + [

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