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.
Für mich ist es nicht klar, was Sie fragen. Könnten Sie bitte die Frage mit weiteren Details und Beispielen aktualisieren? – boh
Ich denke, er muss Commit-Verlauf einer bestimmten Zeile in einer bestimmten Datei abrufen. – Eray
Nr. Ich muss die gesamte Codezeile pro Datei für ein bestimmtes Commit abrufen. – Benjamin