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 dediff
, 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>
.