Приведенные выше ответы не подходят для некоторых случаев, когда вам нужно исключить перемещенный текст (например, если я перемещу функцию в коде или абзаце в латексе дальше по документу, я не хочу считать все эти изменения изменениями!) )
Для этого вы также можете рассчитать количество повторяющихся строк и исключить их из вашего запроса, если дубликатов слишком много.
Например, опираясь на другие ответы, я могу сделать:
git diff $sha~1..$sha|grep -e"^+[^+]" -e"^-[^-]"|sed -e's/.//'|sort|uniq -d|wc -w|xargs
вычисляет количество повторяющихся слов в diff, где sha
- ваш коммит.
Вы можете сделать это для всех коммитов за последний день (с 6 утра):
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
Печать: добавлено, удалено, дубликаты
(Я использую строку diff для дубликатов, поскольку она исключает время, когда git diff
пытается быть слишком умным, и предполагает, что вы на самом деле только что изменили текст, а не переместили его. Это также исключает случаи, когда учитывается одно слово как дубликат.)
Или, если вы хотите быть изощренным, вы можете полностью исключить коммиты, если дублирование превышает 80%, и суммировать остальные:
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
У меня есть этот скрипт, чтобы сделать это здесь: https://github.com/MilesCranmer/git-stats.
Это распечатывает:
➜ 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
Коммиты, в которых я просто перемещаюсь, очевидны, поэтому я не считаю эти изменения. Он подсчитывает все остальное и сообщает мне общее количество измененных слов.