Số liệu thống kê cam kết Git nào dễ lấy


90

Trước đây, tôi đã rất thích khả năng tạo số liệu thống kê cam kết đơn giản của TortoiseSvn cho một kho lưu trữ SVN nhất định. Tôi tự hỏi những gì có sẵn trong Git và đặc biệt quan tâm đến:

  • Số lượng cam kết trên mỗi người dùng
  • Số dòng đã thay đổi trên mỗi người dùng
  • hoạt động theo thời gian (ví dụ: thay đổi tổng hợp hàng tuần)

Bất kỳ ý tưởng?

Câu trả lời:


197

Trên thực tế, git đã có một lệnh cho việc này:

git shortlog

trong trường hợp của bạn, có vẻ như bạn quan tâm đến biểu mẫu này:

git shortlog -sne

Xem --helpcác tùy chọn khác nhau.

Bạn cũng có thể quan tâm đến dự án GitStats . Họ có một vài ví dụ, bao gồm cả số liệu thống kê cho dự án Git . Từ trang chính của GitStat:

Dưới đây là danh sách một số thống kê được tạo hiện tại:

  • Thống kê chung: tổng số tệp, dòng, cam kết, tác giả.
  • Hoạt động: cam kết theo giờ trong ngày, ngày trong tuần, giờ trong tuần, tháng trong năm, năm và tháng và năm.
  • Tác giả: danh sách tác giả (tên, cam kết (%), ngày cam kết đầu tiên, ngày cam kết cuối cùng, tuổi), tác giả của tháng, tác giả của năm.
  • Tệp: số tệp theo ngày, phần mở rộng
  • Dòng: Dòng mã theo ngày

1
Điều này thật đúng với gì mà tôi đã tìm kiếm. Tuyệt vời mà bạn thực sự có thể thay thế các dòng mã trong ví dụ của tôi với "git shortlog -sn" Vote cho câu trả lời này
Jesper Ronn-Jensen

13
cũng git shortlog -sn --no-mergesxóa "các cam kết hợp nhất" khỏi số lượng.
lbolla

4
Tháng 2 năm 2010: Linus tấn công!
naught101

25

Đầu tiên, bạn không phải kéo bất cứ thứ gì (như trong mạng kéo), bởi vì bạn có toàn bộ kho lưu trữ và toàn bộ lịch sử cục bộ. Tôi khá chắc rằng có những công cụ sẽ cung cấp cho bạn số liệu thống kê, nhưng đôi khi bạn chỉ có thể sáng tạo với các dòng lệnh. Ví dụ: điều này (chỉ ra khỏi đầu tôi) sẽ cung cấp cho bạn số lần cam kết trên mỗi người dùng:

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

Các số liệu thống kê khác mà bạn yêu cầu có thể cần được suy nghĩ nhiều hơn. Bạn có thể muốn xem các công cụ có sẵn. Googling để tìm các git statisticsđiểm tới GitStatscông cụ mà tôi không có kinh nghiệm và thậm chí còn không biết rõ về những gì cần thiết để làm cho nó chạy trên windows, nhưng bạn có thể thử.



4
git shortlogthực sự là lệnh ngay tại đây nhưng ngay cả nếu không có nó, lệnh awk phức tạp trên có thể được repaced bởi| sort | uniq -c
josch

Đúng vậy, @josch.
Michael Krelin - hacker

7

Công cụ tốt nhất cho đến nay tôi đã xác định là gitins Inspector. Nó cung cấp báo cáo tập hợp cho mỗi người dùng, mỗi tuần, v.v.

Bạn có thể cài đặt như bên dưới với npm

npm install -g gitinspector

Chi tiết để có được các liên kết là bên dưới

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

lệnh ví dụ là

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

Vân vân


5

Cảm ơn hacker đã trả lời câu hỏi này. Tuy nhiên, tôi thấy các phiên bản sửa đổi này tốt hơn cho cách sử dụng cụ thể của tôi:

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

(sử dụng awk vì tôi không có gawk trên máy Mac của mình và sắp xếp với comitter hoạt động nhiều nhất ở trên cùng.) Nó xuất ra một danh sách như sau:

 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

Tôi không biết bạn có Mac - nhắc đến con rùa khiến tôi liên tưởng đến cửa sổ. Nhưng dù sao, tôi rất vui vì bạn đã tìm thấy con đường của mình. Đoạn mã của tôi chỉ là một ví dụ và một điểm khởi đầu.
Michael Krelin - hacker 28/09/09

2
Điều này phải được sort -rn.
hughdbrown

@hughdbrown, đối với tôi, -nkhông cần thiết sort -rn. Tôi sử dụng một mac, nhưng "loại số" chỉ đơn giản là làm cho không có sự khác biệt cho các ví dụ tôi đã cố gắng
Jesper Ronn-Jensen

sự khác biệt giữa cái này và git shortlog -sn?
Pejman

2

Dưới đây là các cách để nhận số liệu thống kê cho một nhánh cụ thể hoặc hai hàm băm.

chìa khóa ở đây là khả năng làm HASH..HASH

Dưới đây tôi đang sử dụng hàm băm đầu tiên từ một nhánh đến HEAD là phần cuối của nhánh đó.

Hiển thị tổng số cam kết trong một nhánh

  • git log FIRST_HASH..HEAD --pretty = oneline | wc -l
  • Đầu ra 53

Hiển thị tổng số cam kết cho mỗi tác giả

  • git shortlog FIRST_HASH..HEAD -sne
  • Đầu ra
  • 24 Tên tác giả
  • 9 Tên tác giả


2

Tôi đã viết một tập lệnh shell nhỏ để tính toán thống kê hợp nhất (hữu ích khi xử lý luồng công việc dựa trên chi nhánh tính năng). Dưới đây là một ví dụ đầu ra trên một kho lưu trữ nhỏ:

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

Ngoài ra, nếu bạn đang sử dụng hệ thống yêu cầu kéo của GitHub, tôi đã viết github-pr-stats , cung cấp nhiều dữ liệu hơn so với git-merge-stats và thậm chí còn có một hệ thống plugin để cho phép bạn tích hợp vào các phân tích dành riêng cho công ty của bạn.
Xiong Chiamiov


1

Đây là một tập lệnh ruby ​​đơn giản mà tôi đã sử dụng để lấy tác giả, thêm dòng, xóa dòng và số lượng cam kết từ git. Nó không bao gồm các cam kết theo thời gian.

Lưu ý rằng tôi có một mẹo là nó bỏ qua bất kỳ cam kết nào thêm / xóa hơn 10.000 dòng vì tôi cho rằng đây là một kiểu nhập mã nào đó, vui lòng sửa đổi logic cho nhu cầu của bạn. Bạn có thể đặt bên dưới vào một tệp có tên gitstats-simple.rb và sau đó chạy

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

nội dung của 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

Bạn có thể sử dụng gitlogged gem ( https://github.com/dexcodeinc/gitlogged ) để nhận các hoạt động theo tác giả và ngày tháng. Điều này sẽ cung cấp cho bạn báo cáo như thế này:

gitlogged 2016-04-25 2016-04-26

trả về kết quả sau

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

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

Sửa đổi https://stackoverflow.com/a/18797915/3243930 . đầu ra gần với dữ liệu đồ thị của 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

Nếu bạn đang sử dụng github, PR Count là một ứng dụng github được xây dựng để hiển thị số liệu thống kê về đóng góp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.