Die Verwendung git gui blame
ist in Skripten schwer zu verwenden, und obwohl git log -G
und git log --pickaxe
kann Ihnen jeweils zeigen, wann die Methodendefinition angezeigt oder verschwunden ist, habe ich keine Möglichkeit gefunden, sie dazu zu bringen, alle Änderungen aufzulisten, die am Hauptteil Ihrer Methode vorgenommen wurden.
Sie können jedoch gitattributes
und die textconv
Eigenschaft verwenden, um eine Lösung zusammenzusetzen, die genau das tut. Obwohl diese Funktionen ursprünglich dazu gedacht waren, Ihnen bei der Arbeit mit Binärdateien zu helfen, funktionieren sie hier genauso gut.
Der Schlüssel ist, dass Git alle Zeilen außer denen, an denen Sie interessiert sind, aus der Datei entfernt, bevor Sie Diff-Operationen ausführen. Dann git log
wird git diff
usw. nur der Bereich angezeigt, an dem Sie interessiert sind.
Hier ist der Überblick darüber, was ich in einer anderen Sprache mache. Sie können es für Ihre eigenen Bedürfnisse optimieren.
Schreiben Sie ein kurzes Shell-Skript (oder ein anderes Programm), das ein Argument verwendet - den Namen einer Quelldatei - und nur den interessanten Teil dieser Datei ausgibt (oder nichts, wenn nichts davon interessant ist). Sie können sed
beispielsweise Folgendes verwenden:
#!/bin/sh
sed -n -e '/^int my_func(/,/^}/ p' "$1"
Definieren Sie einen Git- textconv
Filter für Ihr neues Skript. ( gitattributes
Weitere Informationen finden Sie in der Manpage.) Der Name des Filters und die Position des Befehls können beliebig sein.
$ git config diff.my_filter.textconv /path/to/my_script
Weisen Sie Git an, diesen Filter zu verwenden, bevor Sie Differenzen für die betreffende Datei berechnen.
$ echo "my_file diff=my_filter" >> .gitattributes
Nun, wenn Sie verwenden -G.
( man beachte die .
) alle Commits aufzulisten , die sichtbaren Veränderungen erzeugen , wenn der Filter angewendet wird, haben Sie genau die Commits , dass Sie daran interessiert sind. Jede andere Optionen , die Git Diff - Routinen zu verwenden, wie zum Beispiel --patch
, wird erhalten Sie auch diese eingeschränkte Ansicht.
$ git log -G. --patch my_file
Voilà!
Eine nützliche Verbesserung, die Sie möglicherweise vornehmen möchten, besteht darin, dass Ihr Filterskript einen Methodennamen als erstes Argument (und die Datei als zweites) verwendet. Auf diese Weise können Sie eine neue Methode von Interesse angeben, indem Sie einfach aufrufen git config
, anstatt Ihr Skript bearbeiten zu müssen. Zum Beispiel könnten Sie sagen:
$ git config diff.my_filter.textconv "/path/to/my_command other_func"
Natürlich kann das Filterskript alles tun, was Sie wollen, mehr Argumente annehmen oder was auch immer: Es gibt viel Flexibilität, die über das hinausgeht, was ich hier gezeigt habe.