[解決済み】Git Blame コミットの統計情報
2022-04-12 07:27:44
質問
blame(またはもっと適切な機能、および/またはシェルコマンドとの組み合わせ)を悪用して、各コミッターから現在リポジトリにどれだけの行(のコード)があるか統計を取るにはどうしたらよいでしょうか?
出力例です。
Committer 1: 8046 Lines
Committer 2: 4378 Lines
解決方法は?
更新情報
git ls-tree -r -z --name-only HEAD -- */*.c | sed 's/^/.\//' | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep -ae "^author "|sort|uniq -c|sort -nr
途中、いくつか更新しました。
便宜上、これを独立したコマンドにすることもできます。
#!/bin/bash
# save as i.e.: git-authors and set the executable flag
git ls-tree -r -z --name-only HEAD -- $1 | sed 's/^/.\//' | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep -ae "^author "|sort|uniq -c|sort -nr
これをパスのどこかに保存するか、パスを変更して次のように使用します。
-
git authors '*/*.c' # look for all files recursively ending in .c
-
git authors '*/*.[ch]' # look for all files recursively ending in .c or .h
-
git authors 'Makefile' # just count lines of authors in the Makefile
オリジナル回答
この回答は適切なものですが、非常に時間がかかります。
$ git ls-tree --name-only -z -r HEAD|egrep -z -Z -E '\.(cc|h|cpp|hpp|c|txt)$' \
|xargs -0 -n1 git blame --line-porcelain|grep "^author "|sort|uniq -c|sort -nr
は、ほぼ瞬時です。
現在追跡しているファイルの一覧を取得するには
git ls-tree --name-only -r HEAD
このソリューションでは
file
を使用してファイルタイプを決定し、パフォーマンス上の理由から希望する拡張子にマッチするように grep を使用します。すべてのファイルを含める場合は、この行を削除してください。
grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$' # for Python files
ファイルにスペースが含まれている場合、使用できるシェルに悪い影響を与えます。
git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'
xargs を使ってコマンドを呼び出したり、引数を分散させたりすることができます。複数のファイルを処理できるようにするコマンドは
-n1
. この場合
git blame --line-porcelain
で、呼び出しごとにちょうど1つの引数を使用します。
xargs -n1 git blame --line-porcelain
次に、quot;author の出現をフィルタリングして、リストをソートし、重複する行を数えることにします。
grep "^author "|sort|uniq -c|sort -nr
備考
他の回答では、実際に空白文字だけを含む行をフィルタリングしています。
grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "
上記のコマンドは、少なくとも1つの非空白文字を含む行の作者を表示します。また、match
\w*[^\w#]
でない行を除外することもできます。
#
(多くのスクリプト言語でのコメント)。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] 既存の、プッシュされていないコミットメッセージを修正するには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] Git フェッチ リモートブランチ
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Gitのプッシュでエラーが発生! [リモート拒否] master -> master (pre-receive hook declined) error: failed to push s...
-
[解決済み】gpgがデータの署名に失敗した fatal: failed to write commit object [Git 2.10.0].
-
[解決済み] Git - node_modules フォルダをどこでも無視するようにしました。
-
[解決済み] git でディレクトリ階層が異なる 2 つのブランチをマージするには?
-
[解決済み] git status に fatal: bad object HEAD と表示される。
-
[解決済み] git commit signing failed: secret key not available.
-
[解決済み] fatal: bad revision "とはどういう意味ですか?
-
[解決済み] GitのFETCH_HEADとはどういう意味ですか?
-
[解決済み] ssh-keygen' は内部コマンドまたは外部コマンドとして認識されません。
-
[解決済み】Git リポジトリで、特定の作者が変更した行の合計を数えるには?