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.

3voto

Leon Points 20011

Voici un outil de comparaison personnalisé qui permet d'effectuer des recherches à l'intérieur des changements (mais pas dans le contexte) :

Utilisation

GIT_EXTERNAL_DIFF="mydiff --grep foo" git diff

Cela affichera les lignes dans vos modifications qui contiennent foo (y compris les lignes où foo a disparu à cause de vos modifications). Tout motif grep peut être utilisé à la place de foo .

Chaque ligne de sortie commence par le préfixe suivant :

filename: oldlinenum: newlinenum|

Le script peut également être utilisé sans l'option --grep dans ce cas, il formate simplement le diff complet (c'est-à-dire en fournissant le contexte complet) comme décrit ci-dessus.

mydiff

#!/bin/bash

my_diff()
{
    diff --old-line-format="$1"':%6dn:      |-%L'     \
         --new-line-format="$1"':      :%6dn|+%L'     \
         --unchanged-line-format="$1"':%6dn:%6dn| %L' \
         $2 $3
}

if [[ $1 == '--grep' ]]
then
    pattern="$2"
    shift 2
    my_diff "$1" "$2" "$5"|grep --color=never '^[^|]\+|[-+].\+'"$pattern"'.*'
else
    my_diff "$1" "$2" "$5"
fi

exit 0

2voto

Je l'ai utilisé avec grande satisfaction :)

grep -ri <MY_PATTERN> $(git diff 790e26393d --name-only)

1voto

Horace Points 11

Sous Windows, la solution est simple :

git diff -U0 | findstr string

Si vous voulez un regroupement par nom de fichier, utilisez ceci

FOR /F "usebackq delims==" %i IN (`git diff --name-only`) do git diff -U0 %~fi | findstr string

1voto

petiar Points 474

Cela a fait l'affaire pour moi, j'espère que cela aidera quelqu'un :

git diff | grep  -P '^\+|^\-'

0voto

Javier Buzzi Points 2107

Les solutions proposées ne correspondaient pas exactement à mes besoins, ce qui a permis de résoudre les problèmes suivants mon question.

(
    START_DIFF=abc123
    END_DIFF=123dcf 

    # loop over all the files that have changed inside the diff
    # you can add a `| grep '<ext>$'` to the end of `--name-only`
    # if you need to be more aggresive with the filtering / or 
    # make it go faster...
    for file in $(git diff $START_DIFF $END_DIFF --name-only); do
        # loop over every line of the diff FOR that file.
        while IFS= read -r line; do
            # prepend the file name to every line
            echo "$file:$line"
        done < <(git diff $START_DIFF $END_DIFF $file)
    done
) | grep what-youre-looking-for

Je n'ai pas réussi à faire fonctionner les numéros de ligne, mais je n'en avais pas vraiment besoin pour les faire fonctionner. Le nom de fichier ajouté au préalable me suffisait.


C'est exactement mon problème :

Trouvez tous les fichiers qui ont ajouté soit un from __future__ import .. ou un -*- coding: utf-8 -*- sur plus de 70 dossiers.

(
    START_DIFF=branch-a
    END_DIFF=HEAD
    for file in $(git diff $START_DIFF $END_DIFF --name-only); do
        while IFS= read -r line; do
            echo "$file:$line"
        done < <(git diff $START_DIFF $END_DIFF $file)
    done
) | grep ':+' | awk '(/import/ && /__future/) || (/coding/)'

Le résultat ressemble à ceci :

....
app/tests/test_views.py:+# -*- coding: utf-8 -*-
app/tests/test_views.py:+from __future__ import absolute_import
app/tests/test_views.py:+from __future__ import division
app2/tests/test_views.py:+from __future__ import division
...

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