In einem Git-Code-Repository möchte ich alle Commits auflisten, die ein bestimmtes Word enthalten. Ich habe es versucht
git log -p | grep --context=4 "Word"
aber es gibt nicht unbedingt den Dateinamen zurück (es sei denn, es sind weniger als 5 Zeilen von dem gesuchten Wort entfernt. Ich habe es auch versucht.)
git grep "Word"
aber es gibt mir nur anwesende Dateien und nicht die Geschichte.
Wie kann ich den gesamten Verlauf durchsuchen, um Änderungen an einem bestimmten Wort zu verfolgen? Ich meine meine Codebasis nach Vorkommen von Word durchsuchen, um Änderungen aufzuspüren (Suche im Dateiverlauf).
Wenn Sie alle Commits finden möchten, in denen commit message das angegebene Word enthält, verwenden Sie
$ git log --grep=Word
Wenn Sie alle Commits finden möchten, bei denen "Word" im Inhalt der Datei hinzugefügt oder entfernt wurde (genauer: Wo sich die Anzahl der Vorkommen von "Word" geändert hat), suchen Sie den Inhalt des Befehls commit , Verwenden Sie die sogenannte "Spitzhacke" -Suche mit
$ git log -Sword
Im modernen Idiot gibt es auch
$ git log -Gword
nach Unterschieden suchen , deren hinzugefügte oder entfernte Zeile mit "Word" übereinstimmt (auch Commit-Inhalt ).
Beachten Sie, dass -G
standardmäßig einen regulären Ausdruck akzeptiert, während -S
eine Zeichenfolge akzeptiert, die aber geändert werden kann, um reguläre Ausdrucke mit dem --pickaxe-regex
zu akzeptieren.
Um den Unterschied zwischen
-S<regex> --pickaxe-regex
und-G<regex>
zu veranschaulichen, betrachten Sie ein Commit mit dem folgenden Unterschied in derselben Datei:+ return !regexec(regexp, two->ptr, 1, ®match, 0); ... - hit = !regexec(regexp, mf2.ptr, 1, ®match, 0);
Während
git log -G"regexec\(regexp"
dieses Commit anzeigt, wirdgit log -S"regexec\(regexp" --pickaxe-regex
dies nicht tun (da sich die Anzahl der Vorkommen dieser Zeichenfolge nicht geändert hat).
git log
s Spitzhacke findet Commits mit Änderungen einschließlich "Word" mit git log -Sword
Nach langem Experimentieren kann ich Folgendes empfehlen: Commits, die Zeilen mit einem bestimmten Regex einführen oder entfernen, und jeweils die Textänderungen mit jeweils hinzugefügten und entfernten Wörtern.
git log --pickaxe-regex -p --color-words -S "<regexp to search for>"
Es dauert eine Weile, bis er rennt ... ;-)
Eine weitere Möglichkeit/Syntax ist: git log -S "Word"
So können Sie beispielsweise nach git log -S "with whitespaces and stuff @/#ü !"
suchen
Sie können den folgenden Befehl versuchen:
git log --patch --color=always | less +/searching_string
oder grep
auf folgende Weise verwenden:
git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'
Führen Sie diesen Befehl in dem übergeordneten Verzeichnis aus, in dem Sie suchen möchten.
So verwenden Sie den booleschen Connector für reguläre Ausdrücke:
git log --grep '[0-9]*\|[a-z]*'
Dieser reguläre Ausdruck sucht nach regulären Ausdrücken [0-9] * oder [a-z] * in Commit-Nachrichten.
vim-flugitive ist für diese Art der Untersuchung in Vim vielseitig.
Verwenden Sie dazu :Ggrep
. Für weitere Informationen können Sie vim-flugitive installieren und das Turorial mit :help Grep
nachschlagen. Und diese Episode: Erkundung der Geschichte eines git-Repository führt Sie dazu, all das zu tun.
Wenn Sie nach sensiblen Daten suchen möchten, um sie aus Ihrer Git-Historie zu entfernen (weshalb ich hier gelandet bin), gibt es dafür Werkzeuge. Github als eine dedizierte Hilfeseite für diese Ausgabe .
Hier ist der Kern des Artikels:
Der BFG Repo-Cleaner ist eine schnellere, einfachere Alternative zu git filter-branch zum Entfernen unerwünschter Daten. Um zum Beispiel Ihre Datei mit vertraulichen Daten zu entfernen und Ihr aktuelles Commit unangetastet zu lassen, führen Sie Folgendes aus:
bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA
Führen Sie Folgendes aus, um den gesamten in passwords.txt aufgeführten Text zu ersetzen, wo auch immer er im Verlauf Ihres Repositorys zu finden ist:
bfg --replace-text passwords.txt
Informationen zur vollständigen Verwendung und zum Herunterladen finden Sie in der Dokumentation zu BFG Repo-Cleaner .