2010-01-19 9 views
7

Ich bin dabei, eine Tonne Dateien in einem bestehenden Projekt zu verschieben. Bevor ich das tue, möchte ich einige Techniken, die zum Analysieren von Code mit mehreren Dateien verwendet werden, im Griff haben.Git: Wie analysiert man Code, der eine Historie von mehreren Dateien hat?

Wie kann ich mit git fragen: "Woher kam diese Codezeile?" wenn der Inhalt in seiner Lebenszeit mehrere Dateien durchlaufen hat?

Ich weiß, git nicht verfolgen Umbenennungen explizit (aus gutem Grund) so scheint es, als ob ich in der Lage, dies zu fragen, ich bin nur nicht sicher, wie. Wenn es Methoden gibt, dies zu visualisieren, wäre das auch großartig.

Antwort

5

Ich würde empfehlen, drei Werkzeuge in der Git-Toolbox zu betrachten. Die erste ist die Schuld, die in etwa so ist wie in cvs. Es zeigt Ihnen an, welcher Commit zuletzt jede Zeile in einer Datei berührt hat. Wenn Sie sehen wollen, was vorher da war, können Sie das Commit, das die Zeile berührt hat, betrachten und sich das vorherige Commit anschauen.

git show <sha1_of_interesting_commit>^ -- file/path 

Sie können die Schuld wiederholen, um zu sehen, was vorher passiert ist.

git blame <sha1_of_interesting_commit>^ -- file/path 

Das zweite Werkzeug wird mit --follow Dateien Vergangenheit umbenennt zu verfolgen.

git log --follow -- file/path 

Das dritte - und möglicherweise das nützlichste - Werkzeug ist die Spitzhacke Option zu loggen. Dies durchsucht die Historie nach Änderungen der entfernten, eingeführten oder geänderten Zeilen, die ein bestimmtes Stück Text enthalten. Dies ist besonders nützlich, um Dinge wie Funktionsnamen zu verfolgen. Es kann neu in einer Datei in einem bestimmten Commit sein, aber kam es aus einer anderen Quelldatei? Wurde ein Anruf zur gleichen Zeit hinzugefügt oder bevor er sich bewegte?

git log -S"Interesting_Function" 

Wenn Sie einen Patch oder stat-Option verwenden (z -p oder --stat) die Ausgabe tatsächlich die Suchkette beteiligt an diesen Dateien, deren Änderungen beschränkt werden, wenn Sie auch --pickaxe-all verwenden, wo die ganze Änderung angezeigt wird.

Kombiniert mit git grep, um anzuzeigen, wo alle aktuellen Vorkommen einer Zeichenfolge sind, ist Spitzhacke ein äußerst nützliches History-Mining-Tool.

0

git blame ist das, was Sie verwenden würden, um zu fragen: "Woher kam diese Codezeile?". Ich weiß nicht, ob es Umbenennungen handhabt. Wahrscheinlich.

+1

git Schuld ist nicht gut für die Erkennung von Linienzügen (besonders beim Refactoring des Codes). Ich meine, wenn ein Entwickler die Zeile geschrieben hat, dann hat der nächste Entwickler die Zeile aus irgendeinem Grund nach oben oder unten verschoben - git tackern wird das letztere zeigen. – Eimantas

+0

Ich denke nicht, dass diese Antwort hilfreich ist, weil 1) 'git tmack 'dir nicht sagt, woher ein bestimmter Code stammt - dafür ist' git log' gedacht. 'git blame' sagt dir einfach die letzte Person, die jede existierende Codezeile in der Datei bearbeitet. 2) 'git blame' folgt nicht umbenennen, es sei denn, Sie fügen den Parameter' --follow' hinzu, wie von der akzeptierten Antwort angezeigt (und selbst dann bricht es zusammen, wenn Dateien zusammengeführt, neu strukturiert, usw.). –