2009-09-28 4 views
77

Раньше я наслаждался способностью TortoiseSvn генерировать простую статистику фиксации для данного репозитория SVN. Интересно, что доступна в Git, и я особенно интересно:Какую Git-фиксацию легко вытащить

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

Любые идеи?

ответ

168

на самом деле, мерзавец уже имеет команду для этого:

git shortlog 

в вашем случае, это звучит, как вы заинтересованы в такой форме:

git shortlog -sne 

См. --help для различных вариантов.

Вы также можете быть заинтересованы в GitStats project. У них есть несколько примеров, в том числе stats for the Git project. На главной странице GitStat:

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

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

Это именно то, что я искал. Удивительно, что вы действительно можете заменить строки кода в моем примере на «git shortlog -sn» Голосовать за этот ответ –

+12

также «git shortlog -sn --no-merges» удалить «merge commits» из счета. – lbolla

+4

февраль 2010: [Линукс атак!] (Http://gitstats.sourceforge.net/examples/git/authors.html#cumulated_added_lines_of_code_per_author) – naught101

23

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

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

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

+5

'git shortlog -s -n' (из http://stackoverflow.com/questions/1828874/generating-statistics-from-git-repository) – naught101

+0

нет необходимости в gawk здесь –

+4

' git shortlog' действительно является правой командой здесь но даже без него сложная команда awk выше может быть заменена на '| сортировать | uniq -c' – josch

6

Благодаря хакеру для ответа на этот вопрос. Тем не менее, я нашел эти модифицированные версии, чтобы быть лучше для моего конкретного использования:

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

(. Используя AWK как я не Gawk на мой макинтош и сортировки с самым активным comitter на вершине) подавался список так:

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 
+0

Я понятия не имел, что у вас есть Mac - упоминание о черепахе заставило меня задуматься о окнах. Но в любом случае, я рад, что ты нашел свой путь. Мой фрагмент был всего лишь примером и отправной точкой. –

+1

Это должно быть 'sort -rn'. – hughdbrown

+0

@hughdbrown, для меня '-n' не требуется в' sort -rn'. Я использую mac, но «sort numeric» просто не имеет значения для примеров, которые я пробовал. –

2

Вот способы, чтобы получить статистику для конкретной отрасли или два хэша.

Ключевым моментом здесь является возможность сделать HASH..HASH

Ниже я использую первый хэш от ветви к головке, конец этой ветви.

Показать общее число фиксаций в филиале

  • журнал мерзавец FIRST_HASH..HEAD --pretty = oneline | туалет -l
  • Выход 53

Показать общее число фиксаций на автора

  • мерзавец shortlog FIRST_HASH..HEAD -sne
  • Выход
  • 24 Автор Название
  • 9 Автор Название
0

DataHero теперь позволяет легко извлекать данные Github и получать статистику. Мы используем его внутренне, чтобы отслеживать прогресс на каждом этапе.

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

Как мы используем это внутренне: https://datahero.com/blog/2013/08/13/managing-github-projects-with-datahero/

Раскрытие информации: Я работаю DataHero

1

Вот простой рубиновый скрипт, который я использовал, чтобы получить автора, строки добавил, строки удалены, и commit count from 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") 
2

я написал a small shell script, что вычисляет слияние статистики (полезно при работа с рабочим процессом на основе отраслевых функций). Вот пример вывода небольшого хранилища:

[$]> 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 
+0

Кроме того, если вы используете Система запроса на подачу GitHub, я написал [github-pr-stats] (https://github.com/xiongchiamiov/github-pr-stats), который предоставляет гораздо больше данных, чем git-merge-stats, и даже имеет плагинную систему для позволяют интегрироваться в свои собственные аналитические исследования компании. –

0

Вы можете использовать gitlogged камень (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") 
4

Лучший инструмент, который до сих пор я идентифицировал, - это gitinspector. Это дает набор отчетов для каждого пользователя, за неделю и т.д.

Вы можете установить, как показано ниже с НПМ

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 

и т.д.

Смежные вопросы