1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gitリポジトリを分析する方法(ファイル数,サイズ,プログラム行数,...)

1
Posted at

タイトルの通り,Gitリポジトリを分析する方法(プログラム)を紹介します.
分析プログラムを実行すると,以下のような出力が得られます.

出力結果
コミット数: 370
ファイル数: 2397
合計サイズ: 41.42 MB
プログラムファイル数: 2339
プログラム行数: 5783
ブランチ数: 2
タグ数: 37
初回コミット日時: Fri Oct 12 22:25:39 2018 +0800
最終コミット日時: Sun Jul 20 00:06:49 2025 +0800
コミット者数: 20
累積変更ファイル数: 4834
総コード変更行数: 583682
リモートURL: https://github.com/BIMK/PlatEMO.git

これは,PlatEMOリポジトリを分析してみた結果です.
実行プログラムは,以下の通りです.

git_repo_stats.sh
echo "コミット数: $(git rev-list HEAD --count)"
echo "ファイル数: $(git ls-tree -r HEAD --name-only | wc -l)"
git ls-tree -r -z HEAD --name-only | xargs -0 wc -c 2>/dev/null | \
    awk '{s+=$1} END {printf "合計サイズ: %.2f MB\n", s/1024/1024}'
echo "プログラムファイル数: $(git ls-tree -r HEAD --name-only | \
    grep -E '\.sh$|\.py$|\.js$|\.m$' | wc -l)"
echo "プログラム行数: $(git ls-tree -r HEAD --name-only | \
    grep -E '\.sh$|\.py$|\.js$|\.m$' | xargs cat 2>/dev/null | wc -l)"
echo "ブランチ数: $(git branch -r | wc -l)"
echo "タグ数: $(git tag | wc -l)"
echo "初回コミット日時: $(git log --reverse --format=%cd | head -n1)"
echo "最終コミット日時: $(git log -1 --format=%cd)"
echo "コミット者数: $(git log --format='%aN' | sort -u | wc -l)"
echo "累積変更ファイル数: $(git log --name-only --pretty=format: | sort -u | wc -l)"
echo "総コード変更行数: $(git log --pretty=tformat: --numstat | \
    awk '{add+=$1; del+=$2} END {print add + del}')"
echo "リモートURL: $(git remote get-url origin)"

必要な行をコピペして使ってください.
プログラムファイル数とプログラム行数の算出では,適切な拡張子の指定が必要です.

プログラム解説

幾つかのプログラム(コマンド)をピックアップして解説します.

shell系

  • echo:文字列を標準出力します
  • $(...):中身を実行し,その結果を出力します(バッククォートとほぼ同じ)
  • wc -l:行数を出力します(Word count, Line)
  • wc -c:バイト数を出力します
  • xargs -0:区切り文字としてヌル文字\0を使い,(前の結果を)標準入力から文字列を受け取り,引数として次に渡します
  • 2>/dev/null:標準エラー出力stderrを捨てます
  • awk:テキスト処理言語です
  • grep:テキスト検索ツールです
  • cat:ファイルの中身を標準出力します
  • head -n1:最初の1行だけ表示します
  • sort -u:重複行の削除を含むソートをします

git系

  • git rev-list HEAD:現在ブランチの最新コミット(HEAD)から,その先祖コミットへ,順に全てのコミットIDを出力します
  • git rev-list HEAD --count:↑の代わりに,対象となるコミット数のみを出力します
  • git ls-tree HEAD:HEADのファイル・ディレクトリ構造を出力します(1階層目のみ)
  • git ls-tree -r HEAD --name-only:↑について,すべてのファイルを対象として,ファイル名のみ出力します
  • git ls-tree -r -z HEAD --name-only:↑について,区切り文字を\nから\0に変更して出力します

終わりに

Gitリポジトリを分析する方法を紹介しました.
自分の関わっている仕事を客観的に知りたくなった時,紹介したプログラムを使ってみてください.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?