Quais estatísticas de commit do Git são fáceis de extrair


90

Anteriormente, eu gostei da capacidade do TortoiseSvn de gerar estatísticas de commit simples para um determinado repositório SVN. Gostaria de saber o que está disponível no Git e estou particularmente interessado em:

  • Número de confirmações por usuário
  • Número de linhas alteradas por usuário
  • atividade ao longo do tempo (por exemplo, alterações semanais agregadas)

Alguma ideia?

Respostas:


197

Na verdade, git já tem um comando para isso:

git shortlog

no seu caso, parece que você está interessado neste formulário:

git shortlog -sne

Consulte o --helppara várias opções.

Você também pode estar interessado no projeto GitStats . Eles têm alguns exemplos, incluindo as estatísticas do projeto Git . Na página principal do GitStat:

Aqui está uma lista de algumas estatísticas geradas atualmente:

  • Estatísticas gerais: total de arquivos, linhas, commits, autores.
  • Atividade: compromissos por hora do dia, dia da semana, hora da semana, mês do ano, ano e mês e ano.
  • Autores: lista de autores (nome, commits (%), data do primeiro commit, data do último commit, idade), autor do mês, autor do ano.
  • Arquivos: contagem de arquivos por data, extensões
  • Linhas: linhas de código por data

1
Isso é exatamente o que eu estava procurando. É incrível que você possa substituir as linhas de código em meu exemplo por "git shortlog -sn" Vote nesta resposta
Jesper Rønn-Jensen

13
também git shortlog -sn --no-mergesremova "commits de mesclagem" da contagem.
lbolla

4
fevereiro de 2010: ataques Linus!
naught101 de

25

Primeiro, você não precisa fazer pull de nada (como no pull de rede), porque você tem todo o repositório e todo o histórico localmente. Tenho certeza de que existem ferramentas que fornecem estatísticas, mas às vezes você pode apenas ser criativo com as linhas de comando. Por exemplo, isso (que saiu da minha cabeça) vai te dar o número de commits por usuário:

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

Outras estatísticas que você solicitou podem precisar de mais reflexão. Você pode querer ver as ferramentas disponíveis. Buscando git statisticspontos para a GitStatsferramenta, com a qual não tenho experiência e ainda menos ideia do que é preciso para executá-la no Windows, mas você pode tentar.



4
git shortlogé de fato o comando correto aqui, mas mesmo sem ele, o comando awk complexo acima pode ser refeito por| sort | uniq -c
josch

Isso é verdade, @josch.
Michael Krelin - hacker

7

A melhor ferramenta que identifiquei até agora é o gitinspector. Fornece o relatório definido por usuário, por semana, etc.

Você pode instalar como abaixo com npm

npm install -g gitinspector

Os detalhes para obter os links estão abaixo

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

comandos de exemplo são

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

etc


5

Obrigado ao hacker por responder a esta pergunta. No entanto, descobri que essas versões modificadas são melhores para meu uso específico:

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

(usando o awk, pois não tenho gawk no meu mac e classificando com o comitter mais ativo no topo). Ele produz uma lista como esta:

 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

Eu não tinha ideia de que você tinha Mac - a menção à tartaruga me fez pensar em janelas. Mas de qualquer maneira, estou feliz que você encontrou o seu caminho. Meu snippet foi apenas um exemplo e um ponto de partida.
Michael Krelin - hacker de

2
Deve ser assim sort -rn.
hughdbrown

@hughdbrown, para mim, -nnão é necessário em sort -rn. Eu uso um mac, mas "classificar numérico" simplesmente não faz diferença para os exemplos que tentei
Jesper Rønn-Jensen

qual é a diferença entre isso e git shortlog -sn?
Pejman

2

Aqui estão maneiras de obter estatísticas para um branch específico ou dois hashs.

chave aqui é a capacidade de fazer HASH..HASH

Abaixo, estou usando o primeiro hash de um branch para o HEAD, que é o fim desse branch.

Mostrar total de commits em um branch

  • git log FIRST_HASH..HEAD --pretty = oneline | wc -l
  • Produto 53

Mostrar total de commits por autor

  • git shortlog FIRST_HASH..HEAD -sne
  • Resultado
  • 24 Nome do Autor
  • 9 Nome do Autor


2

Eu escrevi um pequeno script de shell que calcula as estatísticas de mesclagem (útil ao lidar com um fluxo de trabalho baseado em ramificação de recurso). Aqui está um exemplo de saída em um pequeno repositório:

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

Além disso, se você estiver usando o sistema de solicitação de pull do GitHub, escrevi github-pr-stats , que fornece muito mais dados do que git-merge-stats e até tem um sistema de plug-in para permitir a integração em análises específicas da sua empresa.
Xiong Chiamiov


1

Aqui está um script ruby ​​simples que usei para obter autor, linhas adicionadas, linhas removidas e contagem de commits do git. Não cobre commits ao longo do tempo.

Observe que tenho um truque em que ele ignora qualquer confirmação que adiciona / remove mais de 10.000 linhas, porque presumo que seja algum tipo de importação de código, sinta-se à vontade para modificar a lógica de acordo com suas necessidades. Você pode colocar o seguinte em um arquivo chamado gitstats-simple.rb e depois executar

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

conteúdo de 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

Você pode usar gitlogged gem ( https://github.com/dexcodeinc/gitlogged ) para obter atividades por autor e data. Isso lhe dará um relatório como este:

gitlogged 2016-04-25 2016-04-26

que retorna a seguinte saída

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

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

Modifique https://stackoverflow.com/a/18797915/3243930 . a saída é muito próxima aos dados gráficos do 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

Se você estiver usando o github, o PR Count é um aplicativo github criado para mostrar estatísticas de contribuição.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.