2012-09-17 27 views
37

¿Hay alguna manera de mostrar el git-diff filtrado por un patrón determinado?¿Cómo grep el git diff?

Algo así como

git grepdiff pattern 

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

Por desgracia, la solución más simple no es lo suficientemente bueno

git diff | grep pattern 

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

Vine con una solución usando awk

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

Pero encantaría descubrir que hay es un comando para esto.

+2

Al parecer, el proyecto github llamado git-diff-grep hace algo completamente diferente. – Kuba

Respuesta

55

No estoy seguro, pero no está bien git diff -G <regex> bandera?

-G < expresiones regulares>

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

eso no es exactamente lo que estoy buscando, ya que quiero ver solo las líneas, que coinciden con el patrón, no la diferencia completa de un archivo, que incluye el cambio con el patrón – Kuba

+0

, entonces supongo que no hay una solución más simple que la suya – CharlesB

+0

Al menos git diff -G es un primer paso mejor que el git diff completo. – Kuba

3

utilizo git log -p, que se abre menos (configurable, sin embargo), que a su vez se puede buscar con /. También hay git log -S <searchword>.

+0

Estoy familiarizado con eso, por lo que no estoy buscando en la historia, sino en los cambios de trabajo actuales. – Kuba

+0

Bien, entonces podría usarse el mismo método (como se cita en robinst). Si desea la salida, probablemente pueda usar cualquier biblioteca usando libgit2 o gitgui/gitk. – chelmertz

9

Otra posibilidad sería ver el diff completo y buscar la salida usando los comandos normales less (tipo / y luego el patrón).

Cuando tiene less configurado para mostrar algunas líneas antes del partido usando --jump-target=N, esto es bastante útil. Trate de esta manera:

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

Esto significa que el partido se debe mostrar en la línea 10 (9 muestra líneas de contexto anterior), que puede ser suficiente para ver también el nombre del archivo.

También se puede utilizar, por ejemplo, --jump-target=.5 para que coloque la coincidencia en el medio de la pantalla.

0

Aquí es una herramienta de diferencias personalizado que permite grepping dentro de cambios (pero no el contexto):

Uso

GIT_EXTERNAL_DIFF="mydiff --grep foo" git diff

Esta es la salida de esas líneas en los cambios que contienen foo (incluidas las líneas donde desapareció foo debido a sus cambios). Se puede usar cualquier patrón grep en lugar de foo.

línea Cada salida comienza con el prefijo siguiente:

filename: oldlinenum: newlinenum| 

El script también se puede utilizar sin la opción --grep, en cuyo caso simplemente formatea la diff completo (es decir, proporcionando contexto completo) tal como se describe anteriormente.

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 
0

En Windows, una solución simple es:

git diff -U0 | findstr string 

Si desea agrupar por nombre de archivo, utilice este

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

Esto sirvió para yo, espero que ayude a alguien:

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