Hangi Git kayıt istatistiklerinin alınması kolaydır


91

Daha önce, TortoiseSvn'in belirli bir SVN deposu için basit commit istatistikleri oluşturma yeteneğinden keyif almıştım. Git'te neler olduğunu merak ediyorum ve özellikle şu konularla ilgileniyorum:

  • Kullanıcı başına kaydetme sayısı
  • Kullanıcı başına değişen satır sayısı
  • zaman içindeki aktivite (örneğin haftalık olarak toplanan değişiklikler)

Herhangi bir fikir?

Yanıtlar:


197

Aslında git'in bunun için zaten bir komutu var:

git shortlog

sizin durumunuzda, bu formla ilgileniyorsunuz gibi görünüyor:

git shortlog -sne

--helpÇeşitli seçenekler için bakın .

GitStats projesiyle de ilgilenebilirsiniz . Git projesinin istatistikleri de dahil olmak üzere birkaç örnekleri var . GitStat ana sayfasından:

Şu anda oluşturulmuş bazı istatistiklerin listesi aşağıda verilmiştir:

  • Genel istatistikler: toplam dosyalar, satırlar, taahhütler, yazarlar.
  • Aktivite: günün saatine, haftanın gününe, haftanın saatine, yılın ayına, yıla, aya ve yıla göre taahhüt eder.
  • Yazarlar: yazar listesi (isim, taahhütler (%), ilk taahhüt tarihi, son taahhüt tarihi, yaş), ayın yazarı, yılın yazarı.
  • Dosyalar: tarihe göre dosya sayısı, uzantılar
  • Satırlar: Tarihe göre Kod Satırları

1
Bu tam olarak aradığım şeydi. Örneğimdeki kod satırlarını gerçekten "git shortlog -sn" ile değiştirebilmeniz şaşırtıcı Bu yanıtı oylayın
Jesper Rønn-Jensen

13
ayrıca git shortlog -sn --no-mergessayımdan "birleştirme işlemlerini" de kaldırın.
lbolla


Yazar tarafından kod satır sayısı temel git komutları (gitstats yüklemeye gerek) kullanarak: git ls-files | while read f; do git blame -w -M -C -C --line-porcelain "$f" | grep -I '^author '; done | sort -f | uniq -ic | sort -n --reverse
Hartmut

25

İlk olarak, gerek yok çekme yerel olarak bütün depoyu ve bütün geçmişi var çünkü, (ağ çekme olduğu gibi) herhangi bir şey. Size istatistik verecek araçlar olduğundan oldukça eminim, ancak bazen komut satırlarıyla yaratıcı olabilirsiniz. Örneğin, bu (aklımın dışında) size kullanıcı başına kaydetme sayısını verecektir:

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

İstediğiniz diğer istatistiklerin daha fazla düşünülmesi gerekebilir. Mevcut araçları görmek isteyebilirsiniz. Hiç deneyimim olmayan ve hatta onu pencerelerde çalıştırmak için ne yapılması gerektiğine dair daha az fikrim olan araca git statisticspuanlar için Google'da arama GitStatsyapıyorum, ancak deneyebilirsiniz.



4
git shortlogDoğru komut karmaşık awk komut yukarıda tarafından repaced edilebilir, onsuz burada ama daha gerçekten de| sort | uniq -c
Josch

Bu doğru @josch.
Michael Krelin - hacker

7

Şimdiye kadar tespit ettiğim en iyi araç gitinspector. Ayarlanan raporu kullanıcı başına, haftada vb. Verir.

Npm ile aşağıdaki gibi kurabilirsiniz

npm install -g gitinspector

Bağlantıları almak için detaylar aşağıdadır

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

örnek komutlar

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

vb


5

Hacker'a bu soruyu cevapladığı için teşekkürler. Ancak, bu değiştirilmiş sürümlerin benim özel kullanımım için daha iyi olduğunu buldum:

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

(Mac'imde gawk olmadığından awk kullanarak ve en üstte en aktif comitter ile sıralama yapıyorum.) Şöyle bir liste çıkarır:

 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'in olduğunu bilmiyordum - kaplumbağadan bahsetmek bana pencereleri getirdi. Ama her neyse, yolunu bulduğuna sevindim. Ön bilgim sadece bir örnek ve başlangıç ​​noktasıydı.
Michael Krelin - hacker

2
Bu olmalı sort -rn.
hughdbrown

@hughdbrown, benim için -ngerekli değil sort -rn. Mac kullanıyorum, ancak "sırala sayısal" denediğim örnekler için hiçbir fark
yaratmıyor

bununla arasındaki fark git shortlog -snnedir?
Pejman

2

Belirli bir dal veya iki hash için istatistik almanın yolları.

buradaki anahtar HASH..HASH yapabilme becerisidir

Aşağıda bir daldan o dalın sonu olan HEAD'e ilk hash'i kullanıyorum.

Bir şubedeki toplam kaydetmeyi göster

  • git log FIRST_HASH..HEAD --pretty = oneline | wc -l
  • Çıkış 53

Yazar başına toplam kaydetmeyi göster

  • git shortlog FIRST_HASH..HEAD -sne
  • Çıktı
  • 24 Yazar Adı
  • 9 Yazar Adı


2

Birleştirme istatistiklerini hesaplayan küçük bir kabuk komut dosyası yazdım (özellik dalı tabanlı bir iş akışıyla uğraşırken kullanışlıdır). İşte küçük bir depodaki örnek çıktı:

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

Ayrıca GitHub'ın çekme isteği sistemini kullanıyorsanız, git-merge-istatistiklerinden çok daha fazla veri sağlayan ve hatta kendi şirketinize özel analizlerinize entegre etmenize izin veren bir eklenti sistemine sahip olan github-pr-stats yazdım .
Xiong Chiamiov


1

İşte, git'ten yazar, satırlar eklenmiş, satırlar kaldırılmış ve commit sayısını almak için kullandığım basit bir ruby ​​betiği. Zaman içindeki taahhütleri kapsamaz.

10.000'den fazla satır ekleyen / kaldıran herhangi bir commit'i göz ardı eden bir numaram olduğunu unutmayın çünkü bunun bir tür kod içe aktarması olduğunu varsayıyorum, mantığı ihtiyaçlarınız için değiştirmekten çekinmeyin. Aşağıdakini gitstats-simple.rb adlı bir dosyaya koyabilir ve ardından çalıştırabilirsiniz

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

gitstats-simple.rb içeriği

#!/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

Aktiviteleri yazar ve tarihe göre almak için gitlog gem ( https://github.com/dexcodeinc/gitlog ) kullanabilirsiniz. Bu size şöyle bir rapor verecektir:

gitlogged 2016-04-25 2016-04-26

aşağıdaki çıktıyı döndürür

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

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'u değiştirin . çıktı, github'ın grafik verilerine çok kapalıdır.

#!/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 kullanıyorsanız, PR Count , katkı istatistiklerini göstermek için oluşturulmuş bir github uygulamasıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.