96

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

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

何か案は?

4

13 に答える 13

205

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

git shortlog

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

git shortlog -sne

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

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

現在生成されているいくつかの統計のリストは次のとおりです。

  • 一般的な統計:合計ファイル、行、コミット、作成者。
  • アクティビティ:時間、曜日、時間、月、年と月、および年ごとにコミットします。
  • 作成者:作成者のリスト(名前、コミット(%)、最初のコミット日、最後のコミット日、年齢)、月の作成者、年の作成者。
  • ファイル:日付別のファイル数、拡張子
  • 行:日付別のコード行
于 2009-09-28T15:01:35.683 に答える
26

まず、リポジトリ全体と履歴全体がローカルにあるため、(ネットワーク プルのように) 何もプルする必要はありません。統計情報を提供するツールがあることは確かですが、コマンド ラインを使用することで創造性を発揮できる場合もあります。たとえば、これは(私の頭から)ユーザーごとのコミット数を示します。

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

あなたが求めた他の統計については、さらに検討する必要があるかもしれません。利用可能なツールを確認したい場合があります。git statisticsツールへのポイントをグーグルで検索しGitStatsますが、これは私には経験がなく、Windowsで実行するのに何が必要かについてはさらにわかりませんが、試してみることができます.

于 2009-09-28T13:07:53.013 に答える
10

これまでに特定した最高​​のツールは 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

于 2017-03-13T09:39:33.437 に答える
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
于 2009-09-28T14:42:23.747 に答える
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
于 2014-01-17T00:41:24.547 に答える
2

リポジトリが GitHubにある場合は、現在 (2013 年 5 月)、興味深い統計を取得するための新しい GitHub API のセットがあることに注意してください。
ファイルの CRUD とリポジトリの統計が API で利用できるようになりました」を参照してください。

それには以下が含まれます:

于 2013-05-07T06:36:47.320 に答える
2

特定のブランチまたは 2 つのハッシュの統計を取得する方法を次に示します。

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

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

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

  • git ログ FIRST_HASH..HEAD --pretty=oneline | トイレ -l
  • 出力 53

著者ごとの合計コミット数を表示

  • git shortlog FIRST_HASH..HEAD -sne
  • 出力
  • 24 著者名
  • 9 著者名
于 2012-06-11T22:50:57.387 に答える
1

このgitstatプロジェクトを見る

http://mirror.celinuxforum.org/gitstat/

于 2009-12-14T10:07:00.280 に答える
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")
于 2013-09-14T03:12:28.503 に答える
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")
于 2016-06-14T11:40:00.077 に答える
0

github を使用している場合、PR Countは貢献統計を表示するために作成された github アプリです。

于 2020-03-28T19:47:50.500 に答える