Git: entdecken Sie verpflichtet, die jemals berührt eine Reihe von Linien
Ich habe Schwierigkeiten, herauszufinden, wie man git blame
für immer der Reihe von commits, die immer berührt einem bestimmten Bereich von Zeilen. Es gibt ähnliche Fragen wie diese eine aber die akzeptierte Antwort nicht bringen mich viel weiter.
Sagen wir, ich habe eine definition, die beginnt in Zeile 1000 von foo.rb
. Es ist nur 5 Zeilen lang, aber die Anzahl von commits, die jemals verändert diese Zeilen, ist enorm. Wenn ich
git blame foo.rb -L 1000,+5
Ich Verweise auf (höchstens) fünf verschiedene commits geändert, dass diese Zeilen, aber ich bin auch daran interessiert, die verpflichtet "dahinter".
Ähnlich,
git rev-list HEAD -- foo.rb | xargs git log --oneline
ist fast das, was ich will, aber ich kann nicht angeben, reicht, um git rev-list
Kann ich passiere ein flag zu git blame
aus, um die Liste von commits, die jemals berührten die fünf Linien, oder was ist der Schnellste Weg, ein Skript erstellen, dass Extrakte solche Informationen? Wir ignorieren für den moment die Möglichkeit, dass die definition hatte einmal mehr oder weniger als 5 Zeilen.
- Sind Sie sicher, dass dies ist, was Sie wollen? Die Ermittlung von änderungen mit Zeilennummern funktioniert nur für einen gegebenen Zustand der Datei. Wenn Sie möchten, Zeilen 15 - 20 für den commit
12345
den code auf die Zeilen auf Zeilen 55 - 60 für commit12345^
. - Ziemlich sicher. Das ist, warum ich brauchen, um ein Skript zu schreiben, dass erkennt, dass auch, dass. Immer noch davon ausgehen, der Einfachheit halber, dass die definition hat sich auch nie bewegt in der Datei von der ersten commit in das repo.
- möglich, Duplikat der Abrufen von commit-log für eine bestimmte Zeile in einer Datei?
- Ich glaube, das ist ein Duplikat von stackoverflow.com/questions/8435343/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da Git 1.8.4,
git log
hat-L
zum anzeigen der Entwicklung einer Reihe von Zeilen.Angenommen, Sie betrachten
git blame
's-Ausgabe:Und Sie wollen wissen, die Geschichte von dem, was ist jetzt die Linie 155.
Dann:
Wenn Sie diese Funktionalität verwenden Häufig, vielleicht finden Sie ein git alias nützlich. Legen Sie dazu in Ihrem
~/.gitconfig
:Und jetzt können Sie nur tun
git follow git-web--browse.sh 155
.-
Zeichen in Ihrem Pseudonym bedeuten?Ich denke, das ist, was Sie wollen:
Werde, dass die Ausgabe der Revisionsnummer für jeden commit, der hat bei einer Bearbeitung der Zeilen, die Sie gewählt haben.
Hier sind die Schritte:
Den ersten Teil
git rev-list HEAD -- foo.rb
gibt alle Revisionen, in denen die ausgewählte Datei wird bearbeitet.Jede dieser Revisionen geht dann in den zweiten Teil, die nimmt jeden und bringt es in die
git blame -l -L 1000,+5 $rev -- foo.rb | cut -d ' ' -f 1
. Dies ist ein zwei-Teil-Befehl.git blame -l -L 1000,+5 $rev -- foo.rb
Ausgänge die Schuld für die gewählten Linien. Durch die Fütterung von es die revision-Nummer, sagen wir es anfangen Begehen und gehen von dort aus, anstatt an der Spitze.cut -d ' ' -f 1
gibt uns die erste Spalte (die revision) von der Schuld-Ausgang.awk '{ if (!h[$0]) { print $0; h[$0]=1 } }'
nimmt nicht-benachbarte doppelte Linien unter Beibehaltung der Reihenfolge, wie Sie erschienen. Sehen http://jeetworks.org/node/94 für weitere Informationen zu diesem Befehl.Könnte man hinzufügen, einen letzten Schritt zu schöneren Ausgabe. Rohr alles in
xargs -L 1 git log --oneline -1
und erhalten die entsprechende commit-Nachricht, um die Liste der Revisionen. Ich hatte ein sonderbares Problem mit diesem letzten Schritt, wo ich hatte, zu halten, drücken weiter alle paar Revisionen ausgegeben. Ich bin mir nicht sicher, warum das war, das ist, warum ich nicht in meiner Lösung.Nicht sicher, was Sie tun möchten, aber vielleicht git log -S tun kann den trick für Sie:
Können Sie in string ändern (oder Teil der Veränderung), die Sie versuchen, zu Folgen, und dies wird die Liste der commits, die jemals berührt dies ändern.
Ich mochte dieses puzzle, es hat seine Feinheiten. Quelle dieser Datei sagen
init foo.rb 1000,1005
und Folgen Sie den Anweisungen. Wenn du fertig bist, die Datei@changes
wird die korrekte Liste von commits, die in der topologischen Ordnung und@blames
haben die eigentliche Schuld Ausgabe von jedem.Dies ist dramatisch komplexer als die akzeptierte Lösung oben. Es erzeugt eine Ausgabe, die manchmal nützlicher sein, und schwer zu reproduzieren, und es hat Spaß gemacht zu Programmieren.
Das problem mit der track-line-Nummernkreise automatisch beim treten rückwärts durch die Geschichte ist, wenn eine änderung Brocken überquert line-nummeriert-Bereich Grenzen, man kann nicht automatisch ermitteln, wo in diesem Stück die neue range-Begrenzung muss sein, und Sie werden entweder zu haben, um eine große Reichweite für große Ergänzungen, und so sammeln sich (manchmal viele) irrelevante änderungen, oder legen Sie Sie in den manuellen Modus, um sicherzustellen, dass es richtig (was natürlich bekommt Sie gleich wieder hier), oder akzeptieren, extreme lossage mal an.
Wenn Sie möchten, dass Ihre Ausgabe, um genau zu sein, verwenden Sie die obige Antwort mit vertrauenswürdigen regex reicht, wie `/^type-Funktion(/,/^}/', oder diese, die ist nicht schlecht, ein paar Sekunden pro Schritt zurück in der Zeit.
Im Austausch für die zusätzliche Komplexität, es tut produziert der Trefferliste in topologischer Reihenfolge und es ist zumindest (ziemlich erfolgreich) versuchen, zu lindern die Schmerzen bei jedem Schritt. Es läuft niemals einer redundanten Schuld, zum Beispiel, und aktualisieren-reicht macht das einstellen von Zeilen-Nummern einfacher. Und natürlich gibt es auch auf die Zuverlässigkeit haben, um individuell Augapfel der Kerle... 😛
Diese laufen auf full auto, sagen
{ init foo.rb /^class foo/,/^end/; auto; } 2>&-
Entnehmen Sie bitte die Antwort hier gepostet Liste aller commits, die für eine bestimmte Datei. Seine genau, was Sie brauchen.
Ein paar Gedanken..
Diese klingt ähnlich dieser Beitrag, und es sieht aus wie Sie vielleicht in der Nähe mit so etwas wie dies:
So lange, wie Sie wissen, die definition zu Spiel gegen (für den regex).
Gibt es einen thread die Diskussion hier, über die Verwendung
tig
undgit gui
(die anscheinend könnte dies Griff). Ich habe nicht versucht, diese selbst noch, also kann es nicht überprüfen (ich werde geben dieses ein versuchen Sie es später).