Statistik komit Git mana yang mudah ditarik


91

Sebelumnya saya menikmati kemampuan TortoiseSvn untuk menghasilkan statistik komit sederhana untuk repositori SVN tertentu. Saya ingin tahu apa yang tersedia di Git dan saya sangat tertarik pada:

  • Jumlah komit per pengguna
  • Jumlah baris diubah per pengguna
  • aktivitas dari waktu ke waktu (misalnya perubahan mingguan gabungan)

Ada ide?

Jawaban:


197

Sebenarnya, git sudah memiliki perintah untuk ini:

git shortlog

dalam kasus Anda, sepertinya Anda tertarik dengan formulir ini:

git shortlog -sne

Lihat --helpuntuk berbagai opsi.

Anda mungkin juga tertarik dengan proyek GitStats . Mereka memiliki beberapa contoh, termasuk statistik untuk proyek Git . Dari halaman utama GitStat:

Berikut adalah daftar beberapa statistik yang dihasilkan saat ini:

  • Statistik umum: total file, baris, komit, penulis.
  • Aktivitas: melakukan berdasarkan jam, hari dalam seminggu, jam dalam seminggu, bulan dalam tahun, tahun dan bulan, dan tahun.
  • Penulis: daftar penulis (nama, komit (%), tanggal komit pertama, tanggal komit terakhir, umur), penulis bulan, tahun pengarang.
  • File: jumlah file berdasarkan tanggal, ekstensi
  • Garis: Garis Kode menurut tanggal

1
Inilah yang saya cari. Luar biasa bahwa Anda benar-benar dapat mengganti baris kode dalam contoh saya dengan "git shortlog -sn" Beri suara untuk jawaban ini
Jesper Rønn-Jensen

13
juga git shortlog -sn --no-mergeshapus "menggabungkan komitmen" dari hitungan.
lbolla

4
Februari 2010: Serangan Linus!
n nothing101

25

Pertama, Anda tidak perlu menarik apa pun (seperti dalam penarikan jaringan), karena Anda memiliki seluruh repositori dan seluruh riwayat secara lokal. Saya cukup yakin ada alat yang akan memberi Anda statistik, tetapi terkadang Anda bisa berkreasi dengan baris perintah. Misalnya, ini (di luar kepala saya) akan memberi Anda jumlah komit per pengguna:

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

Statistik lain yang Anda minta mungkin perlu lebih dipikirkan. Anda mungkin ingin melihat alat yang tersedia. Googling untuk git statisticspoin ke GitStatsalat, yang saya tidak memiliki pengalaman dengan dan bahkan kurang ide tentang apa yang diperlukan untuk menjalankannya di windows, tetapi Anda dapat mencoba.



4
git shortlogmemang perintah yang benar di sini tetapi bahkan tanpa itu, perintah awk yang kompleks di atas dapat diganti oleh| sort | uniq -c
josch

Itu benar, @josch.
Michael Krelin - hacker

7

Alat terbaik sejauh ini yang saya identifikasi adalah gitinspector. Ini memberikan laporan yang ditetapkan per pengguna, per minggu dll

Anda dapat menginstal seperti di bawah ini dengan npm

npm install -g gitinspector

Detail untuk mendapatkan tautan di bawah

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

contoh perintahnya adalah

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

dll


5

Terima kasih kepada peretas untuk menjawab pertanyaan ini. Namun, saya menemukan versi modifikasi ini lebih baik untuk penggunaan khusus saya:

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

(menggunakan awk karena saya tidak memiliki gawk di mac saya, dan mengurutkan dengan comitter paling aktif di atas.) Ini menghasilkan daftar seperti:

 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

Saya tidak tahu Anda memiliki Mac - penyebutan kura-kura membuat saya berpikir tentang jendela. Tapi bagaimanapun, saya senang Anda telah menemukan jalan Anda. Cuplikan saya hanyalah sebuah contoh dan titik awal.
Michael Krelin - peretas

2
Ini pasti sort -rn.
hughdbrown

@hughdbrown, bagi saya, -ntidak perlu di sort -rn. Saya menggunakan mac, tetapi "urutkan numerik" tidak ada bedanya untuk contoh yang saya coba
Jesper Rønn-Jensen

apa perbedaan antara ini dan git shortlog -sn?
Pejman

2

Berikut cara mendapatkan statistik untuk satu atau dua cabang tertentu.

Kuncinya di sini adalah kemampuan untuk melakukan HASH..HASH

Di bawah ini saya menggunakan hash pertama dari cabang ke HEAD yang merupakan ujung dari cabang itu.

Tampilkan total komit di sebuah cabang

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

Tunjukkan total komit per penulis

  • git shortlog FIRST_HASH..HEAD -sne
  • Keluaran
  • 24 Nama Penulis
  • 9 Nama Penulis


2

Saya telah menulis skrip shell kecil yang menghitung statistik gabungan (berguna saat berhadapan dengan alur kerja berbasis cabang fitur). Berikut ini contoh keluaran pada repositori kecil:

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

Juga, jika Anda menggunakan sistem permintaan tarik GitHub, saya menulis github-pr-stats , yang menyediakan lebih banyak data daripada git-merge-stats dan bahkan memiliki sistem plugin untuk memungkinkan Anda berintegrasi dalam analisis khusus perusahaan Anda sendiri.
Xiong Chiamiov


1

Berikut adalah skrip ruby ​​sederhana yang saya gunakan untuk mendapatkan penulis, baris ditambahkan, baris dihapus, dan menghitung jumlah dari git. Itu tidak mencakup komitmen dari waktu ke waktu.

Perhatikan bahwa saya memiliki trik di mana ia mengabaikan setiap komit yang menambah / menghapus lebih dari 10.000 baris karena saya berasumsi bahwa ini adalah semacam impor kode, silakan memodifikasi logika untuk kebutuhan Anda. Anda dapat meletakkan di bawah ini ke dalam file bernama gitstats-simple.rb dan kemudian menjalankan

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

isi 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

Anda dapat menggunakan permata gitlogged ( https://github.com/dexcodeinc/gitlogged ) untuk mendapatkan aktivitas menurut penulis dan tanggal. Ini akan memberi Anda laporan seperti ini:

gitlogged 2016-04-25 2016-04-26

yang mengembalikan keluaran berikut

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

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

Ubah https://stackoverflow.com/a/18797915/3243930 . hasilnya lebih dekat dengan data grafik dari 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

Jika Anda menggunakan github, PR Count adalah aplikasi github yang dibuat untuk menunjukkan statistik kontribusi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.