Die obigen Antworten schlagen für einige Anwendungsfälle fehl, in denen Sie verschobenen Text ausschließen müssen (z. B. wenn ich eine Funktion in Code oder Absatz in Latex weiter unten im Dokument verschiebe), möchte ich nicht alle als Änderungen zählen !)
Dafür können Sie auch die Anzahl der doppelten Zeilen berechnen und diese von Ihrer Abfrage ausschließen, wenn zu viele Duplikate vorhanden sind.
Zum Beispiel auf den anderen Antworten bauen, kann ich:
git diff $sha~1..$sha|grep -e"^+[^+]" -e"^-[^-]"|sed -e's/.//'|sort|uniq -d|wc -w|xargs
berechnet die Anzahl der doppelte Wörter in der diff, wo sha
ist Ihr zu begehen.
Sie können dies für alle Commits innerhalb des letzten Tages (seit 06.00) von:
for sha in $(git rev-list --since="6am" master | sed -e '$ d'); do
echo $(git diff --word-diff=porcelain $sha~1..$sha|grep -e"^+[^+]"|wc -w|xargs),\
$(git diff --word-diff=porcelain $sha~1..$sha|grep -e"^-[^-]"|wc -w|xargs),\
$(git diff $sha~1..$sha|grep -e"^+[^+]" -e"^-[^-]"|sed -e's/.//'|sort|uniq -d|wc -w|xargs)
done
Drucke: hinzugefügt, gelöscht
(Ich nehme die Linie diff für Duplikate Duplikate, wie es die Zeiten ausschließt, in denen git diff
versucht, zu schlau zu sein, und davon ausgeht, dass Sie gerade Text geändert und nicht verschoben haben. Er rabattiert auch Fälle, in denen ein einzelnes Wort als Duplikat gezählt wird.)
Oder wenn Sie möchten dazu anspruchsvoll sein Sie können Commits vollständig, wenn mehr als 80% Duplikation ist, auszuschließen und den Rest zusammenzufassen:
total=0
for sha in $(git rev-list --since="6am" master | sed -e '$ d'); do
added=$(git diff --word-diff=porcelain $sha~1..$sha|grep -e"^+[^+]"|wc -w|xargs)
deleted=$(git diff --word-diff=porcelain $sha~1..$sha|grep -e"^-[^-]"|wc -w|xargs)
duplicated=$(git diff $sha~1..$sha|grep -e"^+[^+]" -e"^-[^-]"|sed -e's/.//'|sort|uniq -d|wc -w|xargs)
if [ "$added" -eq "0" ]; then
changed=$deleted
total=$((total+deleted))
echo "added:" $added, "deleted:" $deleted, "duplicated:"\
$duplicated, "changed:" $changed
elif [ "$(echo "$duplicated/$added > 0.8" | bc -l)" -eq "1" ]; then
echo "added:" $added, "deleted:" $deleted, "duplicated:"\
$duplicated, "changes counted:" 0
else
changed=$((added+deleted))
total=$((total+changed))
echo "added:" $added, "deleted:" $deleted, "duplicated:"\
$duplicated, "changes counted:" $changed
fi
done
echo "Total changed:" $total
ich dieses Skript haben, es zu tun hier: https://github.com/MilesCranmer/git-stats.
Dies gibt:
➜ bifrost_paper git:(master) ✗ count_changed_words "6am"
added: 38, deleted: 76, duplicated: 3, changes counted: 114
added: 14, deleted: 19, duplicated: 0, changes counted: 33
added: 1113, deleted: 1112, duplicated: 1106, changes counted: 0
added: 1265, deleted: 1275, duplicated: 1225, changes counted: 0
added: 4207, deleted: 4208, duplicated: 4391, changes counted: 0
Total changed: 147
Das verpflichtet, wo ich gerade um die Dinge offensichtlich bewegen werde, so rechne ich nicht jene Änderungen. Es zählt alles andere auf und sagt mir die Gesamtzahl der veränderten Wörter.
Das ist wirklich eine ausgezeichnete Verwendung - Git ist ein Content-Tracker. Und es ist nicht so ungewöhnlich - werfen Sie einen Blick auf die letztjährige Git Umfrage https://git.wiki.kernel.org/index.php/GitSurvey2009#07._I_use_Git_for_.28check_all_that_apply.29: – Cascabel