Подтвердить что ты не робот

Как получить полные добавления и удаления в данной ветке для данного автора в git

Есть ли способ в git подсчитать общее количество удалений и добавлений для данного пользователя в данной ветки? Что-то вроде этого на github, в разделе графика есть диаграмма, которая показывает вам полные добавления и удаления, но только на главной ветке... Я думаю, что если бы они сделали это, это можно было бы в git также, кто-то знает, как это сделать?

Спасибо заранее.

4b9b3361

Ответ 1

Я не думаю, что Git имеет встроенную команду, которая делает это. Но с помощью некоторых других стандартных утилит это можно сделать. Вот пример, который фильтрует Git вывод журнала через awk, чтобы получить сводку итоговых вложений и удалений:

git log --author=$USER --shortstat $BRANCH | \
awk '/^ [0-9]/ { f += $1; i += $4; d += $6 } \
END { printf("%d files changed, %d insertions(+), %d deletions(-)", f, i, d) }'

Ответ 2

Я перевернул свой собственный, основанный на этом, чтобы рассмотреть случай с более новым git, где 0 вложений или исключений не печатается:

git log --author=$USER --shortstat $BRANCH | 
  ruby -e 'puts $<.read.scan(/(\d+) \w+\(([+-])\)/).group_by(&:last).
  map{|s,ds|s+ds.map(&:first).map(&:to_i).inject(0,&:+).to_s}.join(", ")'

Это просто печатает итоговые значения вставки и удаления, например: +7108, -6742

Если вы хотите, чтобы файлы тоже изменились, эта небольшая версия hacky¹ будет делать:

git log --author=$USER --stat=99999999 $BRANCH | 
  ruby -e 'f,a,d = $<.read.scan(/^ (.*?)\s+\|\s+\d+\s(\+*)(\-*)$/).transpose;
  puts [f.uniq.length, " files, +", a.join.length, ", -", d.join.length].join'

Результат выглядит следующим образом: 97 files, +3701, -3598

Общее количество файлов - это количество уникальных имен файлов во всех коммитах, а не сумма количества файлов, измененных в каждой фиксации, что и дает исходный ответ.


¹ Дело 999… заключается в том, что мы буквально подсчитываем количество + и - s, и нам нужно git не ограничивать их шириной по умолчанию, поэтому мы даем ему очень длинный ширину для работы с.