15 Stimmen

Wie kann ich mit Git kopierten und eingefügten Code erkennen?

Ich habe gerade die git-blame Seite des Handbuchs noch einmal und bemerkte diesen Teil:

Eine besonders nützliche Methode ist es, zu sehen, ob eine hinzugefügte Datei Zeilen enthält, die durch Kopieren und Einfügen aus bestehenden Dateien erstellt wurden. Manchmal deutet dies darauf hin, dass der Entwickler schlampig gearbeitet und den Code nicht richtig refaktorisiert hat. Sie können zunächst den Commit finden, mit dem die Datei eingeführt wurde:

git log --diff-filter=A --pretty=short -- foo

und vermerken dann die Änderung zwischen dem Commit und seinen Eltern, wobei die commit^!-Notation verwendet wird:

git blame -C -C -f $commit^! -- foo

Das klingt recht interessant, aber ich verstehe nicht ganz, wie es funktioniert und warum. Ich frage mich, ob es in einem Git-Hook verwendet werden kann, um kopierten und eingefügten Code zu erkennen.

Kann ein Git-Experte vielleicht die Auswirkungen der Verwendung der oben genannten Git-Befehle zusammen erklären, und ob es möglich ist, so etwas zu verwenden, damit Git anzeigt, ob es Code-Duplikationen gibt (vielleicht durch Verwendung des "Ähnlichkeitsindex", den Git beim Umbenennen von Dateien zu berechnen scheint)?

10voto

mipadi Punkte 377834

Sie können die Befehle einzeln aufschlüsseln.

$ git log --diff-filter=A --pretty=short -- foo

zeigt das Protokoll für die Datei "foo" an. Die --diff-filter zeigt nur Commits an, bei denen Dateien hinzugefügt wurden ("A"), und zwar in einem komprimierten Format (die Option --pretty=short Option). (Die -- ist ein Standard, der besagt, dass nichts, was folgt, eine Option ist, und alles, was danach kommt, ist eine Liste von Dateinamen, auf die das Protokoll angewendet werden soll).

Dann:

$ git blame -C -C -f $commit^! -- foo

git blame versieht jede Zeile einer Datei mit den Informationen der letzten Übertragung. Die doppelte -C -C sucht aggressiv nach Zeilen, die aus anderen Dateien kopiert wurden. Die Option -f zeigt den Dateinamen der ursprünglichen Übertragung an (d.h. wenn eine Zeile aus einer anderen Datei kopiert wurde, sehen Sie den Namen der Datei, aus der sie kopiert wurde). Die Option $commit^! ist die Notation für einen $commit; die ^! Suffix bedeutet, dass alle Eltern von $commit ausgeschlossen werden.

Im Grunde genommen ist also der erste Befehl ( git log ) hilft Ihnen, Commits zu finden, die kopierte Zeilen eingefügt haben; die zweite ( git blame ) hilft Ihnen bei der Suche nach dem Quelle für alle verdächtigen Übertragungen, die von git log .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X