2009-12-21 2 views
15

Ich habe gerade gelesen die git-blame Handbuch Seite noch einmal und bemerkte diesen Teil:Wie kann ich mit git kopierten Code erkennen?

Eine besonders nützliche Art und Weise zu sehen, ob eine zusätzliche Datei durch Kopieren und Einfügen aus vorhandenen Dateien erstellt Linien. Manchmal deutet dies darauf hin, dass der Entwickler nachlässig war und den Code nicht richtig umgestaltet hat. Sie können zuerst finden das Commit, dass die Datei eingeführt mit:

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

und dann die Änderung zwischen dem mit Anmerkungen versehen begehen und seine Eltern, mit begehen ^! Notation:

git Schuld -CC -f $ commit ^! - foo

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

Kann ein Git Experte erklären die Wirkung der Verwendung der oben genannten Git-Befehle zusammen, und ob es möglich ist, etwas zu verwenden, um git zeigen, ob es Code-Duplikation (vielleicht mit dem 'Ähnlichkeitsindex', die git scheint berechnet beim Umbenennen von Dateien)?

Antwort

10

Sie können die Befehle einzeln abbrechen.

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

zeigt das Protokoll für die Datei "foo" an. Die Option --diff-filter zeigt nur Commits an, in denen Dateien hinzugefügt wurden ("A"), und zeigt sie in einem komprimierten Format an (die --pretty=short-Option). (Die -- ist ein Standard für die Worte „nichts, was folgt, ist eine Option“, und alles, was danach eine Liste von Dateinamen, auf das das Protokoll angewandt werden sollte.)

Dann:

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

git blame kommentiert jede Zeile einer Datei mit Informationen aus dem letzten Commit. Die doppelte Option -C -C sucht aggressiv nach Zeilen, die aus anderen Dateien kopiert wurden. Die Option -f zeigt den Dateinamen des ursprünglichen Commits (dh wenn eine Zeile aus einer anderen Datei kopiert wurde, wird der Name der Datei angezeigt, von der sie kopiert wurde). Die $commit^! ist eine Notation für ein $ commit; Das Suffix ^! bedeutet, dass alle Eltern von $ commit ausgeschlossen werden.

Im Grunde hilft Ihnen der erste Befehl (git log), Commits zu finden, die kopierte Zeilen einführten; Die zweite (git blame) hilft Ihnen, die Quelle für alle verdächtigen Commits von git log zurückgegeben.

+0

Danke für die Erklärungen! Die doppelte '-C-C'-Flagge, um Schuldzuweisungen zu machen, sieht wirklich interessant aus –

Verwandte Themen