sirve sch remove que para hace files example commits commands cherrypic cached branches git grep diff

sch - remove git



Cómo grep el git diff? (8)

¿Has probado git diff -S<string> o git diff -G".*string.*" ? Tenga en cuenta que no son equivalentes, consulte la documentación sobre pico para lo que -S hace.

¿Hay alguna manera de mostrar el git-diff filtrado por un patrón dado?

Algo como

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

Lamentablemente, la solución más simple no es lo suficientemente buena

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 me encantaría descubrir que hay un comando para esto.


Aquí hay una herramienta personalizada de diferenciación que permite agrupar los cambios (pero no el contexto):

Uso

GIT_EXTERNAL_DIFF="mydiff --grep foo" git diff

Esto generará esas líneas en los cambios que contengan foo (incluidas las líneas donde foo desapareció debido a los cambios). Se puede usar cualquier patrón grep en lugar de foo .

Cada línea de salida comienza con el siguiente prefijo:

filename: oldlinenum: newlinenum|

La secuencia de comandos también se puede utilizar sin la opción --grep , en cuyo caso simplemente formatea la diferencia completa (es decir, proporciona un contexto completo) como se describe arriba.

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


Creo que su enfoque para la salida de diff "grep" es la mejor solución.

Puedes mejorar tu script awk usando 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 para que coincida con las líneas de color de la terminal
  • marker : marcador para unir la división de diferentes trozos de diff , líneas que comienzan con "diff" coloreado
  • pattern : patrón para buscar, líneas que comienzan con el color "+" o "-" y que contienen "PATRÓN"

Esto imprimirá trozos de diff completos, con PATTERN añadido o eliminado, manteniendo también una salida de color útil.

Tenga en cuenta que ^[ en colored debe ser real, literal ^[ . Puede escribirlos en bash presionando Ctrl + V , Ctrl + [


En Windows, una solución simple es:

git diff -U0 | findstr string

Si desea agrupar por nombre de archivo, use esto

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


Esto hizo el trabajo por mí, espero que ayude a alguien:

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


No estoy seguro pero no es git diff -G <regex> ¿Está bien?

-G <regex>

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


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

Cuando tienes less configurado para mostrar algunas líneas antes del partido usando --jump-target=N , esto es bastante útil. Pruébalo así:

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

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

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


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