Le risposte sopra non riescono per alcuni casi di utilizzo in cui è necessario escludere il testo spostato (ad esempio, se sposto una funzione in codice o paragrafo in latex più in basso nel documento, non voglio contare tutti quelli come modifiche !)
Per questo, è anche possibile calcolare il numero di righe duplicate ed escludere quelle dalla query se ci sono troppi duplicati.
Per esempio, sulla base delle altre risposte, non posso fare:
git diff $sha~1..$sha|grep -e"^+[^+]" -e"^-[^-]"|sed -e's/.//'|sort|uniq -d|wc -w|xargs
calcola il numero di parole duplicate in diff, dove sha
è il vostro commit.
Si può fare questo per tutti i commit entro l'ultimo giorno (dal 6 del mattino) da:
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
Stampe: aggiunte, eliminate, duplica
(prendo il diff linea per i duplicati, poiché esclude i tempi in cui git diff
tenta di essere troppo intelligente e presuppone che in realtà hai appena modificato il testo anziché spostato. Sconti anche le istanze in cui una singola parola viene contata come duplicato.
Oppure, se vuoi per essere sofisticato su di esso , È possibile escludere impegna tutto se non v'è più del 80% la duplicazione, e riassumere il resto:
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
ho questo script per farlo qui: https://github.com/MilesCranmer/git-stats.
Questo stampa:
➜ 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
La impegna in cui io sono solo muoversi le cose sono evidenti, quindi non contano quei cambiamenti. Conta tutto il resto e mi dice il numero totale di parole cambiate.
Questo è davvero un uso eccellente - git è un tracker di contenuti. E non è così insolito - dai uno sguardo al sondaggio git dell'anno scorso https://git.wiki.kernel.org/index.php/GitSurvey2009#07._I_use_Git_for_.28check_all_that_apply.29: – Cascabel