2016-03-29 4 views
-4

i in git mit der folgenden Aussage versucht:Wie kann ich die Codezeile erhalten für eine Datei in git pro begehen

$ wc -l file name 

obige Aussage gibt mir nur für die neueste Version. Aber ich brauche für jeden Einsatz, wie kann ich es bekommen?

+0

Für mich ist es nicht klar, was Sie fragen. Könnten Sie bitte die Frage mit weiteren Details und Beispielen aktualisieren? – boh

+0

Ich denke, er muss Commit-Verlauf einer bestimmten Zeile in einer bestimmten Datei abrufen. – Eray

+0

Nr. Ich muss die gesamte Codezeile pro Datei für ein bestimmtes Commit abrufen. – Benjamin

Antwort

0

Sie können git log verwenden, um alle Commit-Hashes für eine gegebene $filename zu erhalten, und überprüfen Sie diese mit einer for-Schleife in Ihrer Shell. Zum Beispiel (in Zsh):

git stash 
for sha in $(git log --format=format:%H -- $filename); do 
    git checkout $sha -- $filename 
    echo "$(wc -l $filename) @ $sha" 
done 
git stash pop 
+1

Das Skript sollte überprüfen, ob es sicher ist, die Kasse zu verlassen, bevor Sie die Schleife betreten. Wenn die Arbeitskopie nicht festgeschriebene Änderungen enthält, wird sie wahrscheinlich fehlschlagen. Außerdem müssen Sie nicht das gesamte Projekt auschecken. – axiac

+1

@axiac: In der Tat.Dies ist ein sehr einfaches Beispiel und soll nicht erschöpfend sein. Niemand kopiert Code aus StackOverflow und fügt ihn direkt in ein Terminalfenster ein, oder? ;) – Johnsyweb

+0

Wenn der obige Code verwendet wird, ändert der Git-Checkout eines Commits den Timestramp, den Autorennamen des existierenden Codes für diesen Commit. Kann ich dieselbe obige Anweisung verwenden, ohne tatsächlich einen Commitverlauf zu ändern? – Benjamin

1

Der Befehl, den Sie geschrieben hat nichts gemein mit git. wc ist ein universelles Unix-Tool, das die Bytes, Zeichen, Wörter oder Zeilen in einer Datei zählt (der Name steht für word count). Es kann nicht verwendet werden, um die Anzahl der Codezeilen zu zählen, es ist sprachunabhängig und kann eine Codezeile nicht von einem Kommentar unterscheiden.

Wenn Sie jedoch die Gesamtzahl der Zeilen in der Datei benötigen, können Sie den Befehl:

git log --numstat --format=oneline -- file.txt | grep file.txt$ 

eine Geschichte von Änderungen an der angegebenen Datei zu erhalten.

Die Ausgabe enthält drei Spalten, die durch eine variable Anzahl von Leerzeichen getrennt sind. Die erste Spalte enthält die Anzahl der bei jedem Commit hinzugefügten Zeilen, die zweite Spalte enthält die Anzahl der bei diesem Commit entfernten Zeilen, die dritte Spalte ist immer der Pfad der Datei innerhalb des Projekts.

Die Commits werden wie gewohnt in umgekehrter Reihenfolge angezeigt; Die erste Zeile ist das letzte Commit, das die Datei geändert hat, die letzte Zeile ist das Commit, wenn die Datei erstellt wurde (und sollte 0 in der zweiten Spalte enthalten).

Es ist einfach, ein einfaches Skript (in Ihrer bevorzugten Skriptsprache) zu schreiben, um die Ausgabe zu analysieren und die Anzahl der Zeilen der Datei bei jedem Commit zu generieren.

aktualisieren

Die obige Befehlszeile nicht die Hashes verpflichten sich bewahren. Wenn nur der git log-Teil davon ausgeführt wird, werden für jedes Commit zwei Zeilen generiert. Die erste Zeile enthält den Commit-Hash und die erste Zeile der Commit-Nachricht, getrennt durch ein Leerzeichen. Die zweite Zeile ist die oben erläuterte. Immer noch ein einfacher Job für ein kleines Parsing-Skript.

In bash könnte das Parsing-Skript wie folgt aussehen:

#!/bin/bash 

if [ ! -f $1 ]; then echo Cannot find the file \"$1\".; exit 1; fi 

LINES=$(wc -l $1 | sed 's/^ *\([0-9]*\) .*$/\1/') 
git log --numstat --format=oneline -- $1 | while read -r HASH COMMENT; do 
    read -r INSERTED DELETED FILENAME 
    echo $HASH $LINES 
    LINES=$(($LINES-$INSERTED+$DELETED)) 
done 

Es den Dateipfad als erstes Argument akzeptiert und erzeugt eine Liste der Linien; Jede Zeile enthält den Commit-Hash und die Anzahl der Zeilen, die die Eingabedatei nach dem Commit hatte.

Verwandte Themen