854 Stimmen

Wie kann ich Git-Commits nach einem bestimmten Wort durchsuchen?

In einem Git-Code-Repository möchte ich alle Commits auflisten, die ein bestimmtes Wort enthalten. Ich habe dies versucht

git log -p | grep --context=4 "Wort"

aber es gibt mir nicht unbedingt den Dateinamen zurück (es sei denn, er ist weniger als fünf Zeilen vom gesuchten Wort entfernt). Ich habe auch versucht

git grep "Wort"

aber es gibt mir nur die vorhandenen Dateien und nicht die Historie.

Wie durchsuche ich die gesamte Historie, um Änderungen an einem bestimmten Wort zu verfolgen? Ich beabsichtige, meinen Code nach Vorkommen des Wortes zu durchsuchen, um Änderungen nachzuverfolgen (Suche in der Dateihistorie).

0 Stimmen

1251voto

Jakub Narębski Punkte 286531

Wenn Sie alle Commits finden möchten, in denen die Commit-Nachricht ein bestimmtes Wort enthält, verwenden Sie

git log --grep=Wort

Wenn Sie alle Commits finden möchten, in denen "Wort" in den Dateiinhalten hinzugefügt oder entfernt wurde (um genauer zu sein: wo sich die Anzahl der Vorkommen von "Wort" geändert hat), d. h. die Commit-Inhalte suchen, verwenden Sie eine sogenannte 'pickaxe'-Suche mit

git log -SWort

In modernem Git gibt es auch

git log -GWort

um nach Unterschieden zu suchen, deren hinzugefügte oder entfernte Zeile mit "Wort" übereinstimmt (auch Commit-Inhalte).

Ein paar Dinge zu beachten:

  • -G akzeptiert standardmäßig ein Regex, während -S einen String akzeptiert, der jedoch so modifiziert werden kann, dass er Regexe mit der Option --pickaxe-regex akzeptiert.
  • -S findet Commits, in denen sich die Anzahl der Vorkommen von "Wort" geändert hat, während -G Commits findet, in denen "Wort" im Diff erscheint.
  • Dies bedeutet, dass -S --pickaxe-regex und -G nicht genau dasselbe tun.

Das git diff Handbuch enthält eine schöne Erklärung des Unterschieds:

Um den Unterschied zwischen -S --pickaxe-regex und -G zu verdeutlichen, betrachten Sie einen Commit mit dem folgenden Unterschied in derselben Datei:

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

Während git log -G"frotz\(nitfol" diesen Commit anzeigt, zeigt git log -S"frotz\(nitfol" --pickaxe-regex ihn nicht an (weil sich die Anzahl der Vorkommen dieses Strings nicht geändert hat).

Dies zeigt die Commits mit den Suchbegriffen an, aber wenn Sie die tatsächlichen Änderungen in diesen Commits sehen möchten, können Sie --patch verwenden:

git log -G"Suchbegriff" --patch

Dies kann dann an grep weitergeleitet werden, um die Ausgabe nur auf die Anzeige der Commit-Diff-Zeilen mit diesem Suchbegriff zu beschränken. Ein häufiger Anwendungsfall besteht darin, Diff-Zeilen mit diesem Suchbegriff in Commits seit und einschließlich eines bestimmten Commits - in diesem Beispiel 3b5ab0f2a1 - anzuzeigen:

git log 3b5ab0f2a1^.. -G"Suchbegriff" --patch | grep Suchbegriff

0 Stimmen

-S und -G in man git log ist so undeutlich. Ich musste drei Mal lesen und experimentieren, um den Unterschied zu erkennen.

3 Stimmen

@TankorSmash -S Suchen Sie nach Unterschieden, die eine Instanz von einführen oder entfernen. -G Suchen Sie nach Unterschieden, deren hinzugefügte oder entfernte Zeile mit dem angegebenen übereinstimmt.

1 Stimmen

@m-ric Oh, ich verstehe, eine einzelne Zeichenfolge Instanz, im Vergleich zu einer ganzen Linie! Danke

268voto

u0b34a0f6ae Punkte 45029

git log's Pickaxe wird Commits mit Änderungen einschließen, die "Wort" mit git log -Sword enthalten

65 Stimmen

Dies ist nicht ganz genau. -S Suchen Sie nach Unterschieden, die eine Instanz von einführen oder entfernen. Beachten Sie, dass dies anders ist als wenn die Zeichenfolge einfach im Diff-Output erscheint;

5 Stimmen

Während dies im Allgemeinen die richtige Antwort ist, habe ich nur abgewertet, um andere zu ermutigen, diese Antwort (stackoverflow.com/a/1340245/586983) zu lesen, die 3 verschiedene Möglichkeiten enthält und ihre Feinheiten erklärt.

29 Stimmen

Gott! Ich denke nicht, dass das ein guter Grund ist, um eine richtige Antwort herunterzustimmen... Warst du nicht sicher, ob es ausreichen würde, den Link in einem Kommentar einzuschließen?

51voto

CharlesW Punkte 865

Nach viel Experimentieren kann ich Folgendes empfehlen, das Commits anzeigt, die Zeilen einführen oder entfernen, die eine bestimmte Regexp enthalten, und die Textänderungen in jedem Commit mit Farben zeigt, die hinzugefügte und entfernte Wörter anzeigen.

git log --pickaxe-regex -p --color-words -S ""

Dauert jedoch eine Weile, bis es ausgeführt ist... ;-)

4 Stimmen

Dies ist bisher einer der besten, vielen Dank. Hinweis: Um alle Ergebnisse ohne Paginierung aufzulisten, fügen Sie entweder GIT_PAGER=cat vor dem Befehl hinzu oder hängen Sie es mit | cat an.

2 Stimmen

Geben Sie einen Pfad oder eine Datei an, um schneller zu sein git log --pickaxe-regex -p --color-words -S ""

0 Stimmen

Kann dies so geändert werden, dass nur die Zeilen angezeigt werden, die dem Muster entsprechen, anstatt des gesamten diffs? (Ich habe die Antwort hier gefunden: stackoverflow.com/a/51603771/1231241)

12voto

1u- Punkte 465

Noch eine Möglichkeit/Syntax, um dies zu tun, ist: git log -S "Wort"
Auf diese Weise können Sie zum Beispiel nach git log -S "mit Leerzeichen und Sachen @/#ü !" suchen

12voto

kenorb Punkte 134883

Sie können den folgenden Befehl ausprobieren:

git log --patch --color=always | less +/searching_string

oder verwenden Sie grep auf folgende Weise:

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

Führen Sie diesen Befehl im übergeordneten Verzeichnis aus, in dem Sie suchen möchten.

2 Stimmen

Ich mag diese Methode, weil die Commits, die ich mir anschaue, Hunderte von Zeilen mit nicht zusammenhängenden Änderungen haben, und ich nur an den tatsächlichen Patches interessiert bin, die das Wort enthalten, nach dem ich suche. Um Farbe zu erhalten, verwenden Sie git log --patch --color=always | less +/suchwort.

0 Stimmen

Um etwas in den Müllcommits zu finden, verwenden Sie: git fsck | grep -Po '(?<=commit ).*' | GIT_PAGER xargs git grep 'search_string'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X