Статистику коміту Git легко отримати


90

Раніше я користувався можливістю TortoiseSvn генерувати просту статистику комітів для даного сховища SVN. Цікаво, що є в Git, і мене особливо цікавить:

  • Кількість коміт на одного користувача
  • Кількість рядків, змінених на одного користувача
  • активність у часі (наприклад, сукупні щотижневі зміни)

Будь-які ідеї?

Відповіді:


197

Насправді у git вже є команда для цього:

git shortlog

у вашому випадку, схоже, вас цікавить ця форма:

git shortlog -sne

Зверніться до --helpрізних варіантів.

Вас також може зацікавити проект GitStats . У них є кілька прикладів, включаючи статистику проекту Git . З головної сторінки GitStat:

Ось список деяких статистичних даних, створених в даний час:

  • Загальна статистика: загальна кількість файлів, рядків, комітів, авторів.
  • Діяльність: здійснюється за годиною дня, днем ​​тижня, годиною тижня, місяцем року, роком та місяцем та роком.
  • Автори: список авторів (ім'я, коміти (%), дата першого комітування, дата останнього комітування, вік), автор місяця, автор року.
  • Файли: кількість файлів за датою, розширення
  • Рядки: Рядки коду за датою

1
Це саме те, що я шукав. Дивно, що ви можете насправді замінити рядки коду в моєму прикладі на "git shortlog -sn". Проголосуйте за цю відповідь
Jesper Rønn-Jensen

13
також git shortlog -sn --no-mergesвидалити "злиття комітів" з підрахунку.
lbolla


25

По-перше, не потрібно нічого тягнути (як при мережному витягуванні), оскільки у вас є ціле сховище та вся історія локально. Я майже впевнений, що є інструменти, які дадуть вам статистику, але іноді ви можете просто проявляти творчість із командними рядками. Наприклад, це (просто з голови) дасть вам кількість комітів на користувача:

git log --pretty=format:%ae \
| gawk -- '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }'

Інші статистичні дані, про які ви просили, можуть потребувати додаткових роздумів. Можливо, ви захочете побачити доступні інструменти. Шукаю вказівки git statisticsна GitStatsінструмент, з яким я не маю досвіду і ще менше уявляю, що потрібно для його запуску на вікнах, але ви можете спробувати.


6
git shortlog -s -n(Від stackoverflow.com/questions/1828874 / ... )
naught101

4
git shortlogсправді тут є правильною командою, але навіть без неї, складну команду awk вище можна відновити| sort | uniq -c
josch

Це правда, @josch.
Майкл Крелін - хакер

7

На сьогоднішній день найкращим інструментом є gitinspector. Він дає набір звітів для кожного користувача, за тиждень тощо

Ви можете встановити, як показано нижче, з npm

npm install -g gitinspector

Деталі, щоб отримати посилання, наведені нижче

https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector

прикладом команд є

gitinspector -lmrTw
gitinspector --since=1-1-2017

тощо


5

Дякую хакеру за відповідь на це запитання. Однак я виявив, що ці модифіковані версії краще для мого конкретного використання:

git log --pretty=format:%an \
| awk '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }'\
| sort -r

(використовуючи awk, оскільки у мене немає gawk на моєму mac, і сортування з найактивнішим комітером зверху.) Виводиться такий список:

 1205 therikss
 1026 lsteinth
  771 kmoes
  720 minielse
  507 pagerbak
  269 anjohans
  205 mfoldbje
  188 nstrandb
  133 pmoller
   58 jronn
   10 madjense
    3 nlindhol
    2 shartvig
    2 THERIKSS

Я не уявляв, що у вас Mac - згадка про черепаху змусила мене задуматися про windows. Але як би там не було, я радий, що ти знайшов свій шлях. Мій фрагмент був лише прикладом і відправною точкою.
Майкл Крелін - хакер

2
Це повинно бути sort -rn.
hughdbrown

@hughdbrown, для мене, -nне потрібен у sort -rn. Я використовую mac, але "сортувати числові" просто не має значення для прикладів, які я пробував
Jesper Rønn-Jensen

яка різниця між цим і git shortlog -sn?
Pejman

2

Ось способи отримання статистики для певної гілки або двох хешів.

Ключовим тут є можливість робити HASH..HASH

Нижче я використовую перший хеш від гілки до HEAD, що є кінцем цієї гілки.

Показати загальну кількість комітів у гілці

  • git log FIRST_HASH..HEAD --pretty = oneline | wc -l
  • Вихід 53

Показати загальну кількість замовлень на автора

  • git shortlog FIRST_HASH..HEAD -sne
  • Вихідні дані
  • 24 Ім'я автора
  • 9 Ім'я автора


2

Я написав невеликий сценарій оболонки, який обчислює статистику злиття (корисно при роботі з робочим процесом на основі гілок). Ось приклад виводу для невеликого сховища:

[$]> git merge-stats
% of Total Merges               Author  # of Merges  % of Commits
            57.14     Daniel Beardsley            4          5.63
            42.85        James Pearson            3         30.00

Крім того, якщо ви використовуєте систему запитів на витягування GitHub, я написав github-pr-stats , яка надає набагато більше даних, ніж git-merge-stats, і навіть має систему плагінів, яка дозволяє інтегрувати у аналізи вашої компанії.
Xiong Chiamiov


1

Ось простий рубіновий скрипт, який я використовував для отримання автора, додавання рядків, видалення рядків та підрахунку комітів з git. Він не охоплює зобов’язання з часом.

Зауважте, що у мене є хитрість, коли він ігнорує будь-які коміти, які додають / видаляють більше 10000 рядків, оскільки я припускаю, що це якийсь імпорт коду, сміливо змінюйте логіку для своїх потреб. Ви можете помістити наведене нижче у файл, який називається gitstats-simple.rb, а потім запустити

git log --numstat --pretty='%an' | ruby gitstats-simple.rb

вміст gitstats-simple.rb

#!/usr/bin/ruby

# takes the output of this on stdin: git log --numstat --prety='%an'

map = Hash.new{|h,k| h[k] = [0,0,0]}
who = nil
memo = nil
STDIN.read.split("\n").each do |line|
  parts = line.split
  next if parts.size == 0
  if parts[0].match(/[a-z]+/)
    if who && memo[0] + memo[1] < 2000
      map[who][0] += memo[0]
      map[who][1] += memo[1]
      map[who][2] += 1
    end
    who = parts[0]
    memo = [0,0]
    next
  end
  if who
    memo[0]+=line[0].to_i
    memo[1]+=parts[1].to_i
  end
end

puts map.to_a.map{|x| [x[0], x[1][0], x[1][1], x[1][2]]}.sort_by{|x| -x[1] - x[2]}.map{|x|x.inspect.gsub("[", "").gsub("]","")}.join("\n")

0

Тепер DataHero дозволяє легко отримувати дані Github та отримувати статистику. Ми використовуємо його внутрішньо, щоб відстежувати прогрес у кожному етапі.

https://datahero.com/partners/github/

Як ми використовуємо його внутрішньо: https://datahero.com/blog/2013/08/13/managing-github-projects-with-datahero/

Розкриття інформації: Я працюю в DataHero


0

Ви можете використовувати gitlogged gem ( https://github.com/dexcodeinc/gitlogged ), щоб отримувати дані про діяльність за автором та датою. Це дасть вам такий звіт:

gitlogged 2016-04-25 2016-04-26

який повертає наступний результат

################################################################

Date: 2016-04-25

Yunan (4):
      fix attachment form for IE (#4407)
      fix (#4406)
      fix merge & indentation attachment form
      fix (#4394) unexpected after edit wo

gilang (1):
      #4404 fix orders cart


################################################################
################################################################

Date: 2016-04-26

Armin Primadi (2):
      Fix document approval logs controller
      Adding git tool to generate summary on what each devs are doing on a given day for reporting purpose

Budi (1):
      remove validation user for Invoice Processing feature

Yunan (3):
      fix attachment in edit mode (#4405) && (#4430)
      fix label attachment on IE (#4407)
      fix void method (#4427)

gilang (2):
      Fix show products list in discussion summary
      #4437 define CApproved_NR status id in order


################################################################

0

Змініть https://stackoverflow.com/a/18797915/3243930 . вихід набагато закритий для графічних даних github.

#!/usr/bin/ruby

# takes the output of this on stdin: git log --numstat --prety='%an'

map = Hash.new{|h,k| h[k] = [0,0,0]}
who = nil
memo = nil
STDIN.read.split("\n").each do |line|
  parts = line.split("\t")
  next if parts.size == 0
  if parts[0].match(/[a-zA-Z]+|[^\u0000-\u007F]+/)
    if who
      map[who][0] += memo[0]
      map[who][1] += memo[1]
      if memo[0] > 0 || memo[1] > 0 
        map[who][2] += 1
      end
    end
    who = parts[0]
    memo = [0,0]
    next
  end
  if who
    memo[0]+=parts[0].to_i
    memo[1]+=parts[1].to_i
  end
end

puts map.to_a.map{|x| [x[0], x[1][0], x[1][1], x[1][2]]}.sort_by{|x| -x[1] - x[2]}.map{|x|x.inspect.gsub("[", "").gsub("]","")}.join("\n")

0

Якщо ви використовуєте github, PR Count - це програма github, створена для показу статистики внесків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.