가져 오기 쉬운 Git 커밋 통계


90

이전에는 주어진 SVN 저장소에 대한 간단한 커밋 통계를 생성하는 TortoiseSvn의 기능을 즐겼습니다. Git에서 무엇을 사용할 수 있는지 궁금하며 특히 관심이 있습니다.

  • 사용자 당 커밋 수
  • 사용자 당 변경된 줄 수
  • 시간 경과에 따른 활동 (예 : 집계 된 주간 변화)

어떤 아이디어?

답변:


197

실제로 git에는 이미 이에 대한 명령이 있습니다.

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 년 2 월 : Linus 공격!
naught101

25

첫째, 전체 리포지토리와 전체 히스토리를 로컬로 가지고 있기 때문에 네트워크 풀 에서처럼 아무것도 필요가 없습니다 . 통계를 제공하는 도구가 있다고 확신하지만 때로는 명령 줄로 창의력을 발휘할 수 있습니다. 예를 들어, 이것은 (내 머리에서) 사용자 당 커밋 수를 제공합니다.

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

요청한 다른 통계에는 더 많은 고려가 필요할 수 있습니다. 사용 가능한 도구를 볼 수 있습니다. 에 대한 인터넷 검색을 git statistics받는 점을 GitStats나는 그것이 윈도우에서 실행되는 데 걸리는 무엇을 더 경험하고 더 적은 생각이 없다 도구,하지만 당신은 시도 할 수 있습니다.



4
git shortlog실제로 여기에서 올바른 명령이지만,이 명령이 없어도 위의 복잡한 awk 명령은 다음과 같이 수정 될 수 있습니다.| sort | uniq -c
josch

맞습니다, @josch.
Michael Krelin-해커 2015 년

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

(맥에 gawk가 없기 때문에 awk를 사용하고 맨 위에 가장 활동적인 커미터로 정렬합니다.) 다음과 같은 목록을 출력합니다.

 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 -nsort -rn. 나는 맥을 사용하지만, "일종의 숫자"단순히 내가 시도의 예에 대한 차이가 없습니다
예스퍼 Rønn - 젠슨

이것과의 차이점은 무엇 git shortlog -sn입니까?
Pejman

2

다음은 특정 분기 또는 두 개의 해시에 대한 통계를 얻는 방법입니다.

여기서 핵심은 HASH..HASH를 수행하는 기능입니다.

아래에서는 분기에서 해당 분기의 끝인 HEAD까지 첫 번째 해시를 사용하고 있습니다.

분기의 총 커밋 표시

  • git log FIRST_HASH..HEAD --pretty = oneline | 화장실 -l
  • 출력 53

작성자 당 총 커밋 표시

  • git shortlog FIRST_HASH..HEAD -sne
  • 산출
  • 24 저자 이름
  • 9 저자 이름


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의 풀 리퀘스트 시스템을 사용 하는 경우 git-merge-stats보다 훨씬 많은 데이터를 제공하고 회사 별 분석에 통합 할 수있는 플러그인 시스템도있는 github-pr-stats를 작성했습니다 .
Xiong Chiamiov


1

다음은 git에서 작성자, 줄 추가, 줄 제거 및 커밋 수를 얻는 데 사용한 간단한 루비 스크립트입니다. 시간 경과에 따른 커밋은 다루지 않습니다.

나는 이것이 일종의 코드 가져 오기라고 가정하기 때문에 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

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")

0

github를 사용하는 경우 PR Count 는 기여도 통계를 표시하기 위해 구축 된 github 앱입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.