2012-06-17 14 views
18

Ich versuche nach Änderungen in meinem Git-Geschichte in Bezug auf einen sehr spezifischen Variablennamen zu suchen.Git Suche alle Diffs

Ich habe versucht das zu tun:

git diff HEAD~25000 | grep -in mydistinctvariablename 

Die Ergebnisse mir nicht sagen, welche die Ergebniszeilen zu begehen sind aus und es dauert ziemlich viel Zeit (ca. 5-7 Minuten).

Hat jemand eine bessere Lösung, zeit- und ergebnisorientiert?

+2

möglich duplikat von [Wie grep (suchen) die git history?] (Http://stackoverflow.com/questions/2928584/how-to-grep-search-the-git-history) –

+0

Hmm keine von denen Befehle sagen mir, aus welcher Revision das Suchergebnis stammt, nur die Datei, in der die Änderung erfolgte –

+0

Ist für mich die SHA vor dem Dateinamen in den Ergebnissen. Ich habe den ersten Befehl in der ersten Antwort verwendet. Die [zweite Antwort] (http://stackoverflow.com/a/2928721/211563) gibt es wahrscheinlich mehr, was Sie suchen, und das gibt auch die SHA (vorausgesetzt, Ihr Protokollformat zeigt es). –

Antwort

27

git log ist im Allgemeinen der Befehl, der beim Überprüfen des Commitverlaufs verwendet wird. git log --grep kann verwendet werden, um in der Commit-Nachricht nach regulären Ausdrücken zu suchen.

Was sind Sie nach ist git log -S, die den Inhalt einfach oder git log -G begehen sucht, die sie mit einem regulären Ausdruck sucht:

-S Blick für Unterschiede, die Einführung oder eine Instanz entfernen. Beachten Sie, dass dies anders ist als die Zeichenfolge, die einfach in der diff-Ausgabe erscheint; Weitere Informationen finden Sie in der Spitzhacke in gitdiffcore (7).

So zum Beispiel in der msysGit Repository kann ich das sagen zu, dass Tcl eingeführt 8.5.8 entweder:

C:\src\msysgit\src>git log --oneline --grep "8\.5\.8" 
d938476 Make `NO_SFX=1 portable-release.sh` work 
ef1dc94 Update tk to version 8.5.8 
a910049 Update tcl to version 8.5.8 
a702d7f tcltk: update to 8.5.8 and exclude release.sh from the cleanup list 

, die für 8.5.8 sah nur in den Nachrichten begehen oder, wie Sie will in einer Zeichenfolge zu tun suchen, der nur in der engagierten diff aufgetreten:

C:\src\msysgit\src>git log --oneline -S"version=8.5.8" 
7be8622 tcltk: update release.sh script for tcl/tk 8.5.9 
a702d7f tcltk: update to 8.5.8 and exclude release.sh from the cleanup list 

der Bereich begrenzt werden Sie in Ihrer Probe noch hier verwendet werden kann, die Commits geprüft werden zu begrenzen. Lesen Sie das git log Handbuch sorgfältig durch, um eine gute Vorstellung von all den Dingen zu bekommen, die es tun kann.

Beachten Sie, dass -S sieht nur für einfache Zeichenfolge Unterschiede - wenn Sie wirklich den Inhalt mit einem regulären Ausdruck ähnlich wie Sie beispielsweise suchen möchten, dann sollten Sie die Option -G statt -S verwenden, aber dies wird deutlich langsamer.

+0

Wenn ich, im ersten Ausschnitt, die Zeile 'd938476 Make \' NO_SFX = 1 portable-release.sh \ 'work' ist verwirrend, wie Hinweise darauf, dass der erste Ausschnitt ist, was der zweite ist (mit anderen Worten, ich denke, es wäre klarer, wenn diese Zeile aus der Beispielausgabe entfernt würde ...) – acdcjunior