Gibt es eine Möglichkeit, git dazu zu bringen, Ihnen ein Festschreibungsprotokoll für nur Festschreibungen zu geben, die eine bestimmte Zeile in einer Datei berührt haben ?
Wie git blame
aber git blame
werden Sie die letzten COMMIT , dass eine bestimmte Linie berühren.
Ich möchte wirklich ein ähnliches Protokoll erhalten, nicht die Liste der Commits an einer beliebigen Stelle in der Datei, sondern nur die Commits, die eine bestimmte Zeile berührt haben.
Antworten:
Siehe auch Git: Entdecken Sie, welche Commits jemals eine Reihe von Zeilen berührt haben .
Da Git 1.8.4 ,
git log
hat-L
die Entwicklung einer Reihe von Linien zu sehen.Angenommen, Sie sehen sich
git blame
die Ausgabe an. Hier-L 150,+11
bedeutet "nur die Zeilen 150 bis 150 + 11 betrachten":Und Sie möchten die Geschichte der heutigen Zeile 155 kennenlernen.
Dann verwenden
git log
. Hier-L 155,155:git-web--browse.sh
bedeutet "Verfolgen Sie die Entwicklung der Zeilen 155 bis 155 in der genannten Dateigit-web--browse.sh
".quelle
git log commitA-hash -L 155,155:file-name
?Mit pick-ax können Sie eine Reihe von Commits abrufen.
Dadurch erhalten Sie alle Commits, die diesen Text in dieser Datei betroffen haben. Wenn die Datei irgendwann umbenannt wurde, können Sie --follow-parent hinzufügen.
Wenn Sie die Commits bei jeder dieser Änderungen überprüfen möchten, können Sie dieses Ergebnis an git show weiterleiten:
quelle
git log -S'the previous version of the line'
und so weiter, genau wie Sie es am Ende tun würdengit blame -L
. Und es wird viel langsamer sein alsgit blame
, da es überall nach dem Text suchen muss, nicht nur an der gegebenen Stelle.Versuchen Sie es mit dem folgenden Befehl, der in Git 1.8.4 implementiert ist.
Also, in deinem Fall
upperLimit
&lowerLimit
ist das berührtline_number
Weitere Informationen - https://www.techpurohit.com/list-some-useful-git-commands
quelle
--pretty=short
wird bei der Verwendung ignoriert-L
. Bitte korrigierenEine extrem einfache Möglichkeit, dies zu tun, ist die Verwendung von vim-fugitive . Öffnen Sie einfach die Datei in vim, wählen Sie die Zeile (n) aus, die Sie verwenden möchten
V
, und geben Sie sie einJetzt können Sie alle Revisionen der Datei verwenden
:cnext
und:cprev
anzeigen, in der diese Zeile geändert wurde. Geben Sie jederzeit ein, um:Gblame
die Informationen zu sha, Autor und Datum anzuzeigen.quelle
Vereinfachung der Antwort von @ matt -
git blame -L14,15 -- <file_path>
Hier werden Sie für eine Linie verantwortlich gemacht
14 to 15
.Da die
-L
OptionRange
als Parameter erwartet, können wirBlame
mit der-L
Option keine für eine einzelne Zeile erhalten .Referenz
quelle
Ich glaube nicht, dass dafür etwas eingebaut ist. Die Tatsache, dass sich eine einzelne Zeile selten mehrmals ändert, ohne dass sich auch der Rest der Datei wesentlich ändert, macht es schwierig, sodass sich die Zeilennummern häufig stark ändern.
Wenn Sie das Glück haben, dass die Zeile immer ein identifizierendes Merkmal aufweist, z. B. eine Zuordnung zu einer Variablen, deren Name sich nie geändert hat, können Sie die Regex-Option für verwenden
git blame -L
. Zum Beispiel:Dies findet aber nur den ersten Übereinstimmung für diesen regulären Ausdruck. Wenn Sie also keine gute Möglichkeit haben, die Linie abzugleichen, ist dies nicht allzu hilfreich.
Sie könnten etwas hacken, nehme ich an. Ich habe gerade keine Zeit, Code zu schreiben, aber ... etwas in diese Richtung. Ausführen
git blame -n -L $n,$n $file
. Das erste Feld ist das zuvor berührte Commit, und das zweite Feld ist die Zeilennummer in diesem Commit, da es sich hätte ändern können. Nehmen Sie diese und führen Sie sie ausgit blame -n $n,$n $commit^ $file
, dh ausgehend vom Commit vor dem letzten Ändern der Datei.(Beachten Sie, dass dies fehlschlägt, wenn das letzte Commit, das die Zeile geändert hat, ein Zusammenführungs-Commit war. Dies kann in erster Linie passieren, wenn die Zeile im Rahmen einer Lösung für Zusammenführungskonflikte geändert wurde.)
Bearbeiten: Ich bin heute im März 2011 auf diesen Mailinglisten-Beitrag gestoßen, in dem dies erwähnt wird
tig
und dergit gui
über eine Funktion verfügt, die Ihnen dabei hilft. Es sieht so aus, als ob die Funktion für Git selbst in Betracht gezogen, aber noch nicht fertiggestellt wurde.quelle
Dies ruft
git blame
für jede sinnvolle Überarbeitung zu zeigen Zeile$LINE
der Datei$FILE
:Wie üblich zeigt die Schuld die Revisionsnummer am Anfang jeder Zeile. Sie können anhängen
Um aggregierte Ergebnisse zu erhalten, so etwas wie eine Liste von Commits, die diese Zeile geändert haben. (Nicht ganz, wenn Code nur verschoben wurde, wird möglicherweise dieselbe Commit-ID zweimal für verschiedene Inhalte der Zeile angezeigt. Für eine detailliertere Analyse müssten Sie einen verzögerten Vergleich der
git blame
Ergebnisse für benachbarte Commits durchführen. )quelle
Hier ist eine Lösung, die einen Git-Alias definiert, damit Sie ihn folgendermaßen verwenden können:
Ausgabebeispiel:
Sie können den Alias in Ihrer .gitconfig definieren oder einfach den folgenden Befehl ausführen
Dies ist ein hässlicher Einzeiler, daher hier eine nicht verschleierte äquivalente Bash-Funktion:
Die Spitzhackelösung ( Git Log - Pickaxe-Regex -S'REGEX ' ) gibt Ihnen nur , nicht die anderen Änderungen der Zeile, die den regulären Ausdruck enthält.
Eine Einschränkung dieser Lösung ist die Schuld tad nur die 1. REGEX-Übereinstimmung zurückgibt. Wenn also mehrere Übereinstimmungen vorhanden sind, kann die Rekursion "springen", um einer anderen Zeile zu folgen. Überprüfen Sie unbedingt die vollständige Verlaufsausgabe, um diese "Sprünge" zu erkennen, und korrigieren Sie dann Ihren REGEX, um die Parasitenlinien zu ignorieren.
Schließlich ist hier eine alternative Version, die git show bei jedem Commit ausführt, um den vollen Unterschied zu erhalten:
quelle
Sie können
git blame
undgit log
Befehle mischen , um die Zusammenfassung jedes Commits im Befehl git tad abzurufen und anzuhängen. So etwas wie das folgende Bash + Awk-Skript. Die Commit-Zusammenfassung wird als Codekommentar inline angehängt.In einer Zeile:
quelle
In meinem Fall hatte sich die Zeilennummer im Laufe der Zeit stark geändert. Ich war auch auf Git 1.8.3, das Regex in "Git Blame -L" nicht unterstützt. (RHEL7 hat noch 1.8.3)
Einzeiler:
Dies kann natürlich in ein Skript oder eine Funktion umgewandelt werden.
quelle