Git คอมมิตสถิติใดที่ดึงได้ง่าย


91

ก่อนหน้านี้ฉันมีความสุขกับความสามารถของ TortoiseSvn ในการสร้างสถิติการคอมมิตอย่างง่ายสำหรับที่เก็บ SVN ที่กำหนด ฉันสงสัยว่ามีอะไรบ้างใน Git และสนใจเป็นพิเศษใน:

  • จำนวนคอมมิตต่อผู้ใช้
  • จำนวนบรรทัดที่เปลี่ยนแปลงต่อผู้ใช้
  • กิจกรรมในช่วงเวลาหนึ่ง (เช่นการเปลี่ยนแปลงรายสัปดาห์รวม)

ความคิดใด ๆ ?

คำตอบ:


197

จริงๆแล้วคอมไพล์มีคำสั่งสำหรับสิ่งนี้อยู่แล้ว:

git shortlog

ในกรณีของคุณดูเหมือนว่าคุณสนใจแบบฟอร์มนี้:

git shortlog -sne

ดู--helpตัวเลือกต่างๆ

นอกจากนี้คุณยังอาจสนใจในโครงการ GitStats พวกเขามีไม่กี่ตัวอย่างรวมทั้งสถิติสำหรับโครงการ Git จากหน้าหลัก GitStat:

นี่คือรายการสถิติบางส่วนที่สร้างขึ้นในปัจจุบัน:

  • สถิติทั่วไป: ไฟล์ทั้งหมดบรรทัดคอมมิตผู้เขียน
  • กิจกรรม: ทำตามชั่วโมงของวันวันในสัปดาห์ชั่วโมงในสัปดาห์เดือนปีปีและเดือนและปี
  • ผู้แต่ง: รายชื่อผู้แต่ง (ชื่อคอมมิต (%) วันที่คอมมิตครั้งแรกวันที่คอมมิตครั้งสุดท้ายอายุ) ผู้แต่งเดือนผู้แต่งปี
  • ไฟล์: จำนวนไฟล์ตามวันที่นามสกุล
  • เส้น: บรรทัดของรหัสตามวันที่

1
นี่คือสิ่งที่ฉันกำลังมองหา น่าทึ่งที่คุณสามารถแทนที่บรรทัดรหัสในตัวอย่างของฉันด้วย "git shortlog -sn" โหวตให้คำตอบนี้
Jesper Rønn-Jensen

13
ยังgit shortlog -sn --no-mergesลบ "กระทำการผสาน" จากการนับ
lbolla

4
กุมภาพันธ์ 2010: Linus โจมตี!
naught101

25

ขั้นแรกคุณไม่จำเป็นต้องดึงอะไรเลย (เช่นเดียวกับการดึงเครือข่าย) เนื่องจากคุณมีที่เก็บทั้งหมดและประวัติทั้งหมดในเครื่อง ฉันค่อนข้างแน่ใจว่ามีเครื่องมือที่จะให้สถิติแก่คุณ แต่บางครั้งคุณก็สามารถสร้างสรรค์ได้ด้วยบรรทัดคำสั่ง ตัวอย่างเช่นสิ่งนี้ (ออกจากหัวของฉัน) จะให้จำนวนคอมมิตต่อผู้ใช้:

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

สถิติอื่น ๆ ที่คุณขออาจต้องใช้ความคิดเพิ่มเติม คุณอาจต้องการดูเครื่องมือที่มีอยู่ Googling เพื่อหาข้อมูลเกี่ยวgit statisticsกับGitStatsเครื่องมือซึ่งฉันไม่มีประสบการณ์และไม่มีความคิดแม้แต่น้อยว่าจะต้องทำอย่างไรเพื่อให้มันทำงานบน windows แต่คุณสามารถลองได้


6
git shortlog -s -n(จากstackoverflow.com/questions/1828874/… )
naught101

4
git shortlogเป็นคำสั่งที่ถูกต้องที่นี่ แต่ถึงแม้จะไม่มีคำสั่ง awk ที่ซับซ้อนข้างต้นสามารถแทนที่ได้โดย| sort | uniq -c
josch

ที่แท้ @josch
Michael Krelin - แฮ็กเกอร์

7

เครื่องมือที่ดีที่สุดที่ฉันระบุคือ gitinspector ให้รายงานชุดต่อผู้ใช้ต่อสัปดาห์ ฯลฯ

คุณสามารถติดตั้งด้านล่างด้วย npm

npm install -g gitinspector

รายละเอียดการรับลิงค์อยู่ด้านล่าง

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

ตัวอย่างคำสั่งคือ

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

ฯลฯ


5

ขอบคุณแฮ็กเกอร์ที่ตอบคำถามนี้ อย่างไรก็ตามฉันพบว่าเวอร์ชันที่แก้ไขเหล่านี้ดีกว่าสำหรับการใช้งานเฉพาะของฉัน:

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

(ใช้ awk เพราะฉันไม่มี gawk บน mac ของฉันและเรียงลำดับโดยมี comitter ที่ใช้งานมากที่สุดอยู่ด้านบน) มันแสดงรายการดังนี้:

 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 - การพูดถึงเต่าทำให้ฉันนึกถึงหน้าต่าง แต่อย่างไรก็ตามฉันดีใจที่คุณพบทางของคุณ ตัวอย่างข้อมูลของฉันเป็นเพียงตัวอย่างและจุดเริ่มต้น
Michael Krelin - แฮ็กเกอร์

2
ต้องเป็นsort -rnอย่างนี้
hughdbrown

@hughdbrown สำหรับฉันไม่จำเป็นต้องมีใน-n sort -rnฉันใช้ mac แต่ "จัดเรียงตัวเลข" ก็ไม่ได้สร้างความแตกต่างสำหรับตัวอย่างที่ฉันได้ลอง
Jesper Rønn-Jensen

อะไรคือความแตกต่างระหว่างสิ่งนี้กับgit shortlog -sn?
Pejman

2

ต่อไปนี้เป็นวิธีรับสถิติสำหรับสาขาหนึ่งหรือสองแฮช

ที่สำคัญนี่คือความสามารถในการทำ HASH..HASH

ด้านล่างฉันใช้แฮชแรกจากสาขาไปยัง HEAD ซึ่งเป็นจุดสิ้นสุดของสาขานั้น

แสดงการกระทำทั้งหมดในสาขา

  • บันทึกคอมไพล์ FIRST_HASH..HEAD --pretty = oneline | wc -l
  • เอาต์พุต 53

แสดงการกระทำทั้งหมดต่อผู้เขียน

  • คอมไพล์ shortlog FIRST_HASH..HEAD -sne
  • เอาต์พุต
  • 24 ชื่อผู้แต่ง
  • 9 ชื่อผู้แต่ง

2

โปรดทราบว่าหาก repo ของคุณอยู่บน GitHubตอนนี้ (พฤษภาคม 2013) คุณจะมี GitHub API ชุดใหม่เพื่อรับสถิติที่น่าสนใจ
ดู " ไฟล์ CRUD และสถิติที่เก็บพร้อมใช้งานใน API แล้ว "

ซึ่งจะรวมถึง:


2

ฉันได้เขียนเชลล์สคริปต์ขนาดเล็กที่คำนวณสถิติการผสาน (มีประโยชน์เมื่อจัดการกับเวิร์กโฟลว์ที่ใช้คุณลักษณะสาขา) นี่คือตัวอย่างผลลัพธ์บนที่เก็บขนาดเล็ก:

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

นอกจากนี้หากคุณใช้ระบบดึงคำขอของ GitHub ฉันเขียนgithub-pr-statsซึ่งให้ข้อมูลมากกว่า git-merge-stats และยังมีระบบปลั๊กอินเพื่อให้คุณสามารถรวมเข้ากับการวิเคราะห์เฉพาะ บริษัท ของคุณเอง
Xiong Chiamiov


1

นี่คือสคริปต์ทับทิมง่ายๆที่ฉันใช้ในการรับผู้แต่งเพิ่มบรรทัดลบบรรทัดและนับคอมมิตจากคอมไพล์ ไม่ครอบคลุมการกระทำเมื่อเวลาผ่านไป

โปรดทราบว่าฉันมีเคล็ดลับที่จะละเว้นการกระทำใด ๆ ที่เพิ่ม / ลบมากกว่า 10,000 บรรทัดเพราะฉันคิดว่านี่เป็นการนำเข้าโค้ดบางประเภทโปรดปรับเปลี่ยนตรรกะตามความต้องการของคุณ คุณสามารถใส่ด้านล่างลงในไฟล์ชื่อ gitstats-simple.rb แล้วเรียกใช้

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

เนื้อหาของ 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

ตอนนี้ DataHero ทำให้การดึงข้อมูล Github และรับสถิติเป็นเรื่องง่าย เราใช้ภายในเพื่อติดตามความคืบหน้าในแต่ละเหตุการณ์สำคัญ

https://datahero.com/partners/github/

เราใช้ภายในอย่างไร: https://datahero.com/blog/2013/08/13/managing-github-projects-with-datahero/

การเปิดเผยข้อมูล: ฉันทำงานให้กับ DataHero


0

คุณสามารถใช้ gitlogged gem ( https://github.com/dexcodeinc/gitlogged ) เพื่อรับกิจกรรมตามผู้แต่งและวันที่ สิ่งนี้จะให้คุณรายงานดังนี้:

gitlogged 2016-04-25 2016-04-26

ซึ่งส่งคืนผลลัพธ์ต่อไปนี้

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

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 ผลลัพธ์จะใกล้เคียงกับข้อมูลกราฟของ 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")

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.