簡単にプルできるGitコミット統計


90

以前は、特定のSVNリポジトリーに対して単純なコミット統計を生成するTortoiseSvnの機能を楽しんでいました。私はGitで何が利用可能か疑問に思っており、特に興味があります:

  • ユーザーあたりのコミット数
  • ユーザーごとに変更された行数
  • 時間の経過に伴うアクティビティ(たとえば、週ごとの変更の集計)

何か案は?

回答:


197

実際、gitにはすでにこのためのコマンドがあります。

git shortlog

あなたの場合、このフォームに興味があるようです:

git shortlog -sne

--helpさまざまなオプションについては、を参照してください。

GitStatsプロジェクトにも興味があるかもしれません。Gitプロジェクトの統計など、いくつかの例があります。GitStatメインページから:

これは、現在生成されているいくつかの統計のリストです。

  • 一般的な統計:ファイル、行、コミット、作成者の合計。
  • アクティビティ:時間、曜日、時間、月、年と月、年ごとのコミット。
  • 著者:著者のリスト(名前、コミット(%)、最初のコミット日、最後のコミット日、年齢)、月の著者、年の著者。
  • ファイル:日付ごとのファイル数、拡張子
  • 行:日付によるコード行

1
これはまさに私が探していたものです。実際に私の例のコード行を "git shortlog -sn"で実際に置き換えることができるのはすばらしいです。この回答に投票してください
JesperRønn-Jensen'09

13
またgit shortlog -sn --no-merges、「マージコミット」をカウントから削除します。
lbolla

4
2010年2月:Linus攻撃!
naught101 2012年

25

まず、ローカルにリポジトリ全体と履歴全体があるため、(ネットワークプルのように)何もプルする必要はありません。統計情報を提供するツールは確かにあると思いますが、コマンドラインを使って独創的になることもあります。たとえば、これは(私の頭の外に)、ユーザーあたりのコミット数を提供します。

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

あなたが求めた他の統計は、それにもっと考えが必要かもしれません。利用可能なツールを確認したい場合があります。ツールをgit statistics指摘するためのグーグル。GitStatsこれは、Windowsで実行するために何が必要かについてはまったく経験がなく、さらにはほとんどわかりませんが、試すことができます。



4
git shortlog確かにここで正しいコマンドですが、それがなくても、上記の複雑なawkコマンドは次のように置き換えることができます| sort | uniq -c
josch


7

これまでのところ私が特定した最良のツールは、ギチンスペクターです。ユーザーごと、週ごとなどのセットレポートを提供します

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

(私のMacには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を持っているとは思いもしませんでした-亀のことを聞いて、私はWindowsについて考えました。しかし、とにかく、あなたがあなたの道を見つけてうれしいです。私のスニペットはほんの一例であり、出発点でした。
Michael Krelin-ハッカー、

2
これはそうでなければなりませんsort -rn
hughdbrown 2012年

@hughdbrownは、私にとって-nは必要ありませんsort -rn。私はMacを使用していますが、「数値の並べ替え」は、私が試した例ではまったく違いがありません
。– JesperRønn-Jensen2012

これとはgit shortlog -snどう違いますか?
Pejman 2018年

2

特定のブランチまたは2つのハッシュの統計を取得する方法は次のとおりです。

ここで重要なのは、HASH..HASHを実行する機能です。

以下では、ブランチからそのブランチの終わりであるHEADへの最初のハッシュを使用しています。

ブランチの合計コミット数を表示する

  • git log FIRST_HASH..HEAD --pretty = oneline | wc -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のプルリクエストシステムを使用している場合は、github-pr-statsを作成しました。これはgit-merge-statsよりもはるかに多くのデータを提供し、独自の会社固有の分析に統合できるプラグインシステムさえ備えています。
Xiong Chiamiov


1

以下は、gitから作成者、追加行、削除行、およびコミット数を取得するために使用した単純なrubyスクリプトです。長期にわたるコミットは対象外です。

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カウントは貢献度の統計を表示するために構築されたGitHubアプリです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.