Какую статистику коммитов Git легко получить


91

Раньше мне нравилась способность TortoiseSvn генерировать простую статистику фиксации для заданного репозитория SVN. Мне интересно, что доступно в Git, и меня особенно интересуют:

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

Любые идеи?

Ответы:


197

Собственно, в git уже есть для этого команда:

git shortlog

в вашем случае похоже, что вас интересует эта форма:

git shortlog -sne

См. --helpРазличные варианты.

Вас также может заинтересовать проект GitStats . У них есть несколько примеров, включая статистику по проекту Git . На главной странице GitStat:

Вот список некоторых статистических данных, созданных в настоящее время:

  • Общая статистика: всего файлов, строк, коммитов, авторов.
  • Активность: фиксируется по часам дня, дням недели, часам недели, месяцам года, годам, месяцам и годам.
  • Авторы: список авторов (имя, количество коммитов (%), дата первого коммита, дата последнего коммита, возраст), автор месяца, автор года.
  • Файлы: количество файлов по дате, расширения
  • Строки: Строки кода по дате

1
Это именно то, что я искал. Удивительно, что вы действительно можете заменить строки кода в моем примере на «git shortlog -sn». Проголосуйте за этот ответ
Джеспер Рённ-Йенсен,

13
также git shortlog -sn --no-mergesудалите из подсчета «коммиты слияния».
lbolla

4
февраль 2010: Линус атакует!
naught101

25

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

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

Другие статистические данные, которые вы запрашивали, возможно, потребуют более тщательного рассмотрения. Возможно, вы захотите увидеть доступные инструменты. Поиск в Google git statisticsбаллов по GitStatsинструменту, с которым у меня нет опыта и еще меньше представления о том, что нужно, чтобы запустить его в Windows, но вы можете попробовать.



4
git shortlogэто действительно правильная команда, но даже без нее сложную команду awk, приведенную выше, можно заменить| sort | uniq -c
josch 06

Это правда, @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 - упоминание о черепахе напомнило мне об окнах. Но в любом случае я рад, что ты нашел свой путь. Мой фрагмент был просто примером и отправной точкой.
Михаил Крелин - хакер,

2
Так должно быть sort -rn.
hughdbrown

@hughdbrown, для меня, -nне нужен sort -rn. Я использую Mac, но "числовая сортировка" просто не имеет значения для примеров, которые я пробовал
Джеспер Рённ-Йенсен

какая разница между этим и 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

Обратите внимание: если ваше репо находится на GitHub , теперь (май 2013 г.) у вас есть новый набор GitHub API для получения интересной статистики.
См. « Статистика файлов CRUD и репозитория теперь доступна в API »

Это будет включать:


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

Вот простой скрипт ruby, который я использовал для получения автора, добавления строк, удаления строк и количества фиксаций из git. Он не распространяется на фиксации с течением времени.

Обратите внимание, что у меня есть трюк, при котором он игнорирует любую фиксацию, которая добавляет / удаляет более 10 000 строк, потому что я предполагаю, что это какой-то импорт кода, не стесняйтесь изменять логику для своих нужд. Вы можете поместить это в файл с именем 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.