Które statystyki zatwierdzania Git są łatwe do pobrania


91

Wcześniej podobała mi się zdolność TortoiseSvn do generowania prostych statystyk zatwierdzeń dla danego repozytorium SVN. Zastanawiam się, co jest dostępne w Git i szczególnie interesuje mnie:

  • Liczba zatwierdzeń na użytkownika
  • Liczba linii zmienionych na użytkownika
  • aktywność w czasie (na przykład zagregowane zmiany tygodniowe)

Jakieś pomysły?

Odpowiedzi:


197

Właściwie git ma już polecenie do tego:

git shortlog

w twoim przypadku wygląda na to, że interesuje Cię ten formularz:

git shortlog -sne

Zobacz --helpróżne opcje.

Możesz być także zainteresowany projektem GitStats . Mają kilka przykładów, w tym statystyki projektu Git . Ze strony głównej GitStat:

Oto lista niektórych aktualnie generowanych statystyk:

  • Statystyki ogólne: suma plików, wiersze, zatwierdzenia, autorzy.
  • Czynność: zatwierdza według pory dnia, dnia tygodnia, godziny tygodnia, miesiąca roku, roku i miesiąca oraz roku.
  • Autorzy: lista autorów (imię i nazwisko, zatwierdzenia (%), data pierwszego zatwierdzenia, data ostatniego zatwierdzenia, wiek), autor miesiąca, autor roku.
  • Pliki: liczba plików według daty, rozszerzenia
  • Wiersze: wiersze kodu według daty

1
To jest dokładnie to, czego szukałem. Niesamowite, że faktycznie możesz zastąpić linie kodu w moim przykładzie słowem „git shortlog -sn” Głosuj na tę odpowiedź
Jesper Rønn-Jensen

13
git shortlog -sn --no-mergesusuń także z licznika „zatwierdzenia scalania”.
lbolla,


25

Po pierwsze, nie musisz niczego ściągać (jak w przypadku ściągania sieciowego), ponieważ masz całe repozytorium i całą historię lokalnie. Jestem prawie pewien, że istnieją narzędzia, które podają statystyki, ale czasami możesz po prostu wykazać się kreatywnością za pomocą wierszy poleceń. Na przykład to (po prostu z mojej głowy) da ci liczbę zatwierdzeń na użytkownika:

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

Inne statystyki, o które prosiłeś, mogą wymagać więcej przemyślenia. Możesz chcieć zobaczyć dostępne narzędzia. Szukanie git statisticspunktów w GitStatsnarzędziu, z którym nie mam doświadczenia, a nawet mniej pojęcia, co trzeba zrobić, aby uruchomić je w systemie Windows, ale możesz spróbować.



4
git shortlogjest rzeczywiście właściwym poleceniem, ale nawet bez niego złożone polecenie awk powyżej może zostać zastąpione przez| sort | uniq -c
josch

To prawda, @josch.
Michael Krelin - haker

7

Najlepszym dotychczas zidentyfikowanym narzędziem jest gitinspector. Daje zestaw raportów na użytkownika, na tydzień itp

Możesz zainstalować jak poniżej za pomocą npm

npm install -g gitinspector

Szczegóły, aby uzyskać linki, znajdują się poniżej

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

przykładowymi poleceniami są

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

itp


5

Dzięki hakerowi za odpowiedź na to pytanie. Jednak stwierdziłem, że te zmodyfikowane wersje są lepsze dla mojego konkretnego zastosowania:

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

(używając awk, ponieważ nie mam gawk na moim Macu, i sortując z najbardziej aktywnym comitterem na górze). Wyświetla listę taką jak ta:

 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

Nie miałem pojęcia, że ​​masz Maca - wzmianka o żółwiu przypomniała mi o oknach. W każdym razie cieszę się, że znalazłeś swoją drogę. Mój fragment był tylko przykładem i punktem wyjścia.
Michael Krelin - haker

2
To musi być sort -rn.
hughdbrown

@hughdbrown -nnie jest dla mnie konieczne w sort -rn. Używam komputera Mac, ale „sortowanie numeryczne” po prostu nie robi różnicy w przykładach, które wypróbowałem
Jesper Rønn-Jensen

jaka jest różnica między tym a git shortlog -sn?
Pejman

2

Oto sposoby na uzyskanie statystyk dla określonej gałęzi lub dwóch haszów.

Kluczem tutaj jest możliwość wykonania HASH..HASH

Poniżej używam pierwszego skrótu z gałęzi do HEAD, który jest końcem tej gałęzi.

Pokaż całkowitą liczbę zatwierdzeń w gałęzi

  • git log FIRST_HASH..HEAD --pretty = oneline | wc -l
  • Wyjście 53

Pokaż całkowitą liczbę zatwierdzeń na autora

  • git shortlog FIRST_HASH..HEAD -sne
  • Wynik
  • 24 Nazwisko autora
  • 9 Nazwisko autora


2

Napisałem mały skrypt powłoki, który oblicza statystyki scalania (przydatne w przypadku przepływu pracy opartego na gałęziach funkcji). Oto przykładowe dane wyjściowe w małym repozytorium:

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

Ponadto, jeśli używasz systemu żądań ściągnięcia GitHub, napisałem github-pr-stats , który zapewnia znacznie więcej danych niż git-merge-stats, a nawet ma system wtyczek, który umożliwia integrację z analizami specyficznymi dla Twojej firmy.
Xiong Chiamiov


1

Oto prosty skrypt ruby, którego użyłem do pobrania autora, dodania wierszy, usunięcia wierszy i liczby zatwierdzeń z git. Nie obejmuje zmian w czasie.

Zauważ, że mam sztuczkę, w której ignoruje każde zatwierdzenie, które dodaje / usuwa więcej niż 10000 linii, ponieważ zakładam, że jest to jakiś import kodu, możesz zmodyfikować logikę do swoich potrzeb. Możesz umieścić poniższy plik w pliku o nazwie gitstats-simple.rb, a następnie uruchomić

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

zawartość 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

Możesz użyć gitlogged gem ( https://github.com/dexcodeinc/gitlogged ), aby uzyskać działania według autora i daty. W ten sposób otrzymasz następujący raport:

gitlogged 2016-04-25 2016-04-26

która zwraca następujące dane wyjściowe

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

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

Zmodyfikuj https://stackoverflow.com/a/18797915/3243930 . dane wyjściowe są bardzo zbliżone do danych wykresu 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

Jeśli korzystasz z github, PR Count to aplikacja github stworzona do wyświetlania statystyk dotyczących wkładu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.