it-swarm.com.de

Wie grepst du den git diff?

Gibt es eine Möglichkeit, den nach einem bestimmten Muster gefilterten Git-Diff anzuzeigen.

So etwas wie 

git grepdiff pattern

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

Leider ist die einfachste Lösung nicht gut genug

git diff | grep pattern 

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

Ich kam mit einem Workaround mit awk

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

Würde aber gerne herausfinden, dass es dafür einen Befehl gibt.

51
Kuba

Nicht sicher, aber git diff -G <regex>-Flag ist nicht in Ordnung?

-G <Regex>

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

Eine andere Möglichkeit wäre, das gesamte Diff anzuzeigen und die Ausgabe mit den normalen less-Befehlen zu durchsuchen (Typ / und dann das Muster).

Wenn Sie less so konfiguriert haben, dass vor dem Match mit --jump-target=N einige Zeilen angezeigt werden, ist dies sehr nützlich. Versuchen Sie es so:

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

Dies bedeutet, dass die Übereinstimmung in Zeile 10 angezeigt werden soll (9 Kontextzeilen oben), was ausreichend sein kann, um auch den Dateinamen zu sehen.

Sie können auch z. --jump-target=.5, um das Match in der Mitte des Bildschirms zu positionieren.

9
robinst

Haben Sie git diff -S<string> oder git diff -G".*string.*" ausprobiert? Beachten Sie, dass sie nicht gleichwertig sind, siehe der Dokumentation zu Spitzhacke , was -S tut.

8
robinst

Ich benutze git log -p, der weniger öffnet (aber konfigurierbar), was wiederum mit gesucht werden kann /. Es gibt auch git log -S <searchword>.

3
chelmertz

Ich denke, Ihr Ansatz zur Ausgabe von "grep" diff ist die beste Lösung.

Sie können Ihr awk-Skript verbessern, indem Sie sed verwenden:

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, um den farbigen Linien des Terminals zu entsprechen
  • marker: Markierung für die Trennung von Unterschieden diff Punkte, Zeilen beginnend mit farbigem "diff"
  • pattern: Suchmuster, Zeilen, die mit "+" oder "-" beginnen und "PATTERN" enthalten

Dadurch werden vollständige Diff-Hunks mit hinzugefügtem oder entferntem MUSTER gedruckt, wobei auch die nützliche Farbausgabe erhalten bleibt.

Beachten Sie, dass ^[ in colored aktuell sein sollte, wörtlich ^[. Sie können sie in bash eingeben, indem Sie drücken Ctrl + VCtrl + [

1
Hazzard17

Unter Windows ist eine einfache Lösung:

git diff -U0 | findstr string

Wenn Sie nach Dateinamen gruppieren möchten, verwenden Sie diese Option

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

Das hat die Arbeit für mich erledigt, ich hoffe es hilft jemandem:

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

Hier ist ein benutzerdefiniertes Vergleichstool, mit dem innerhalb von Änderungen (aber nicht im Kontext) Änderungen vorgenommen werden können:

Verwendungszweck

GIT_EXTERNAL_DIFF="mydiff --grep foo" git diff

Dadurch werden die Zeilen in Ihren Änderungen ausgegeben, die foo enthalten (einschließlich Zeilen, in denen foo aufgrund Ihrer Änderungen verschwunden ist). Jedes grep-Muster kann anstelle von foo verwendet werden.

Jede Ausgabezeile beginnt mit dem folgenden Präfix:

filename: oldlinenum: newlinenum|

Das Skript kann auch ohne die --grep-Option verwendet werden. In diesem Fall formatiert es einfach den vollständigen Unterschied (d. H. Er stellt den vollständigen Kontext bereit) wie oben beschrieben.

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
Leon