Git: получить количество измененных строк в день - PullRequest
27 голосов
/ 16 ноября 2011

Я хотел бы сделать диаграмму добавленных / удаленных / измененных строк в репозитории git за день и / или неделю. Я не хочу посчитать количество коммитов.

Есть ли инструмент, который может создавать такие диаграммы (gitstats нет)? Или с помощью какой команды git я могу создать вывод, который я могу легко проанализировать?

Спасибо!

Ответы [ 6 ]

27 голосов
/ 16 ноября 2011

Может быть, что-то вроде этого:

$ git diff --shortstat "@{1 month ago}" 
 7 files changed, 29 insertions(+), 6 deletions(-)

(Как видите, я пробовал это в довольно устаревшем хранилище.)

Обратите внимание, что при этом будет сравниваться текущий рабочий каталог с тем, на который текущая ветка указала месяц назад на вашем локальном компьютере.

Редактировать : Чтобы получить статистику по всем коммитам на ветке master в определенном диапазоне дат, вы можете использовать

git log --after=2011-01-01 --before=2011-01-31 --format=format: --shortstat master
26 голосов
/ 20 марта 2012
#!/bin/bash                                                                                                                                                                         
a=""                                                                                                                                                                                
b=""                                                                                                                                                                                
for i in $(seq 1 10)                                                                                                                                                                
do                                                                                                                                                                                  
    b=$(git diff --shortstat "@{ $i day ago }")                                                                                                                                     
    if [[ "$b" != "$a" ]]; then                                                                                                                                                     
        echo $i "day ago" $b                                                                                                                                                        
    fi                                                                                                                                                                              
    a=$b                                                                                                                                                                            
done 

вывод

1 day ago 2 files changed, 144 insertions(+), 21 deletions(-)
3 day ago 2 files changed, 227 insertions(+), 73 deletions(-)

суть

5 голосов
/ 06 сентября 2012

Мне просто нужно было накопить diffstat на некоторое время в хранилище, не полагаясь на reflog (так как хранилище было недавно клонировано).Таким образом, я придумал это:

( eval $(git log --pretty="%H" --since="2 day" | while read line; do if [[ -z ${first} ]]; then first=${line}; echo "export first=${first}"; fi; echo "export last=${line}"; done; ) ; git diff --stat ${first} ${last}; )

Вы можете легко изменить "2 дня", чтобы получить что-то еще:)

4 голосов
/ 05 января 2017

Вот скрипт bash, который вычисляет общее количество измененных строк в неделю:

#!/bin/bash

ds() {
  date --date="$1 weeks ago" +%Y-%m-%d
}
BRANCH=master # your branch here

echo "Week,Lines Changed"
for week in {80..1}
do
  # git log outputs lines like:
  # 11        10      path/to/your/file.java
  #  => add first two columns with awk
  lines=$(git --no-pager log --after=$(ds $week) --before=$(ds $(($week - 1))) --format=format: --numstat $BRANCH | awk '{s+=$1; s+=$2} END {print s}')
  echo "$(ds $week),$lines"
done

Вывод в формате CSV и выглядит так:

Week,Lines Changed
2016-12-21,5989
2016-12-28,17179
2 голосов
/ 14 апреля 2017

Адаптируясь из ответа gnmerritt , этот скрипт будет генерировать количество строк добавления и удаления для каждого календарного дня.

#!/bin/bash

ds() {
  date --date="$1 days ago" +%Y-%m-%d
}

BRANCH=master # your branch here

echo "Date,LinesAdded,LinesDeleted"
for day in $(seq 1 10)
do
  lines=$(git --no-pager log --after=$(ds $day) --before=$(ds $(($day - 1))) --format=format: --numstat $BRANCH  | awk '/([0-9]+).*([0-9]+).*/{s+=$1; t+=$2} END {printf "+"; printf s;printf ",-"; printf t;}')
  if [[ "$lines" != "+,-" ]]; then
      echo "$(ds $day),$lines"
  else
      echo "$(ds $day),0,0"
  fi
done

(ссылка: Github Gist)

0 голосов
/ 07 декабря 2017

Моя версия вышеуказанных скриптов, для статистики за сутки, с хорошим форматированным выводом ...

#!/bin/bash
# Calculate num of changed, new lines on git per days (show your productivity)

ds() {
  date --date="$1 days ago" +%Y-%m-%d
}

echo "GIT changes stat: Date, Total lines modified (New added, Changed)"
for week in {13..0}
do
  # git log outputs lines like:
  # 11        10      path/to/your/file.java
  #  => add first two columns with awk
  lines_all=$(git --no-pager log --after=$(ds $week) --before=$(ds $(($week - 1))) --format=format: --numstat | awk '{s+=$1; s+=$2} END {print s/1}')
  lines_chg=$(git --no-pager log --after=$(ds $week) --before=$(ds $(($week - 1))) --format=format: --numstat | awk '{s+=$1;} END {print s/1}')
  lines_new=$(git --no-pager log --after=$(ds $week) --before=$(ds $(($week - 1))) --format=format: --numstat | awk '{s+=$2}  END {print s/1}')
  #echo -e "$(ds $week): $lines_all \t\t(new: $lines_new, \tchanged: $lines_chg)"
  printf "%10s: %10s \t\t(new: %10s, \tchanged: %10s)\n" $(ds $week) $lines_all $lines_new $lines_chg
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...