gitリポジトリの行数を数える


766

gitリポジトリ内のすべてのファイルに存在する行の総数をどのようにカウントしますか?

git ls-files gitが追跡するファイルのリストを表示します。

catこれらすべてのファイルに対するコマンドを探しています。何かのようなもの

git ls-files | [cat all these files] | wc -l

回答:


1140

xargs あなたが望むことをします:

git ls-files | xargs cat | wc -l

しかし、より多くの情報を使用して、おそらくより良い方法で、次のことができます。

git ls-files | xargs wc -l

11
些細なことだと思います。ソースコードファイル(* .cppなど)のみを含めるのはどうですか。いくつかのbinファイルがコミットされています:)
Daniel

39
grep cpp |その前にそこに留まってくださいxargs
Carl Norum、2012

35
git ls-files -z | xargs -0 wc -l名前にスペースが含まれるファイルがある場合に使用します。
mpontillo 2013年

34
特定のファイルを含めたり除外したりするにgit ls-files | grep -P ".*(hpp|cpp)" | xargs wc -lは、次のよう にします。grepの部分は、必要なperlの正規表現です。
ガブリエル

29
使用できる.javaファイルのみに関心がある場合git ls-files | grep "\.java$" | xargs wc -l
dseibert

352
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

これは、空のツリーと現在の作業ツリーの違いを示しています。これはたまたま現在の作業ツリーのすべての行を数えます。

現在の作業ツリーの数値を取得するには、次のようにします。

git diff --shortstat `git hash-object -t tree /dev/null`

それはあなたにのような文字列を与えます1770 files changed, 166776 insertions(+)


45
ところで、ハッシュを取得するには、を実行しgit hash-object -t tree /dev/nullます。

84
そしてさらに簡潔:git diff --stat `git hash-object -t tree /dev/null`
rpetrich 2012

10
これは、上記のバージョンでカウントされるアーカイブや画像などのバイナリファイルをカウントしないため、より良い解決策です!
BrainStone 2013

31
+1バイナリはカウントされないため、このソリューションの方が好きです。また、我々は本当にただのgitのdiff出力の最後の行に興味を持っている:git diff --stat `git hash-object -t tree /dev/null` | tail -1
ガブリエレPetronella

31
代わりgit diff --shortstat `git hash-object -t tree /dev/null` に、最終行を取得するために使用します。テールは必要ありません。
ジム・ウォルフ

316

プロジェクトのスコープを把握するためにこの数が必要な場合は、CLOC(「Count Lines of Code」)の出力を選択できます。これにより、言語ごとの重要なコード行と重要でないコード行の内訳がわかります。

cloc $(git ls-files)

(この行はと同等です。のコマンド置換機能をgit ls-files | xargs cloc使用します。)sh$()

出力例:

      20 text files.
      20 unique files.                              
       6 files ignored.

http://cloc.sourceforge.net v 1.62  T=0.22 s (62.5 files/s, 2771.2 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Javascript                       2             13            111            309
JSON                             3              0              0             58
HTML                             2              7             12             50
Handlebars                       2              0              0             37
CoffeeScript                     4              1              4             12
SASS                             1              1              1              5
-------------------------------------------------------------------------------
SUM:                            14             22            128            471
-------------------------------------------------------------------------------

最初にCLOCをインストールする必要があります。あなたは、おそらくすることができますインストールclocパッケージマネージャで、例えば- brew install cloc自作

cloc $(git ls-files)多くの場合、の改善cloc .です。たとえば、上記のサンプル出力でgit ls-filesは、471行のコードが報告されています。同じプロジェクトの場合cloc .、Git-ignored node_modulesフォルダーの依存関係を検索するため、456,279行と報告されています(実行には6分かかります)。


4
CLOCはTypeScriptなどの一部の言語を無視します。
Marcelo Camargo、2015年

6
現時点での@MarceloCamargo TypeScriptがサポートされています
Alexander

1
初心者には、「cloc DIRECTORY_WHERE_YOUR_GIT_IN」を実行してラインを計算することをお勧めします。
Shi

完全な説明はこちら:github.com/AlDanial/clocとバイナリはこちら:github.com/AlDanial/cloc/releases/tag/v1.70
Peter Szanto

15
cloc --vcs git最近使用するだけで、不適切な名前のファイル(またはファイルが多すぎる)のいくつかのエッジケースを回避できます。
seanf 2017年

56

git ls-files | xargs wc -l多数のファイルを処理するときにバッチ処理の問題が発生しました。この場合、行数が複数のtotal行に分割されます。

質問からヒントを得るなぜwcユーティリティは「合計」で複数の行を生成するのですか?、問題を回避する次のコマンドを見つけました。

wc -l $(git ls-files)

または、コードなどの一部のファイルのみを調べたい場合:

wc -l $(git ls-files | grep '.*\.cs')


これは素晴らしいことですが、空白を含むパスでは失敗するようです。それを解決する方法はありますか?
Lea Hayes

1
.mp3、.mp4などのバイナリファイルを取得するgrep '。* \。m'で問題が発生しました。findコマンドを使用してコードファイルを一覧表示することでさらに成功しましたwc -l $(git ls-files | find *.m *.h)
Tico Ballagas

3
@LeaHayesこれは1つの方法ですwc -l --files0-from=<(git ls-files -z)<(COMMAND)構文は、内容の結果であるファイルの名前を返しますCOMMAND
2014年

@buckありがとうございますが、そのコマンドを実行しようとするとエラーが発生します。何か案は?
Lea Hayes

1
@LeaHayes私はあなたのために働くと思うこのスクリプトを思いつきました: `` `#!/ bin / bash results = $(git ls-files | xargs -d '\ n' wc -l)let grand_total = 0 for x in $(echo "$ results" | egrep '[[:digit:]] + total $'); do let grand_total + = $(echo "$ x" | awk '{print $ 1}')done echo "$ {results}" echo "grand total:$ {grand_total}" `` `
buck

45

とにかく、私にとっての最良の解決策は、@ ephemientの回答のコメントに埋もれています。見過ごされないように、ここで引き上げています。これに対するクレジットは、@ FRoZeN(および@ephemient)に送られます。

git diff --shortstat `git hash-object -t tree /dev/null`

追加のノイズなしで、リポジトリの作業ディレクトリ内のファイルと行の合計を返します。おまけとして、ソースコードのみがカウントされます。バイナリファイルは集計から除外されます。

上記のコマンドはLinuxとOS Xで動作します。クロスプラットフォームバージョンは

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

これはWindowsでも機能します。

レコードについては、空白行を除外するためのオプション、

  • -w/ --ignore-all-space
  • -b/ --ignore-space-change
  • --ignore-blank-lines
  • --ignore-space-at-eol

とともに使用しても効果はありません--shortstat。空白行がカウントされます。


1
git mktree </dev/nullまたはtrue|git mktreeまたはgit mktree <&-または :|git mktree私たちの間のキーストロークカウンター:-)-リポジトリの周りに浮かぶ予備の空の木は何も傷つけません。
jthill 2015年

2
:そのハッシュが青の外にあるか疑問に思う人々のためにstackoverflow.com/questions/9765453/...
Tejasケール

19

これはcloc 1.68以降で機能します。

cloc --vcs=git


--vcsうまくいきませんでした。おそらく削除されました。cloc .git repoで作業している間、OTOH。
acdcjunior

13

私はcmder(http://gooseberrycreative.com/cmder/)で遊んでいて、html、css、java、javascriptの行を数えたかったのです。上記の回答の一部は機能しましたがor、grepのパターンは機能しませんでした-私はここ(/unix/37313/how-do-i-grep-for-multiple-patterns)を見つけました脱出する

だからこれは私が今使っているものです:

git ls-files | grep "\(.html\|.css\|.js\|.java\)$" | xargs wc -l


2
これはチャンクで応答するように見えました。Justin Aquadroのソリューションと組み合わせてあなたのgrepを使用することは、私にとって良い結果になりました。wc -l $(git ls-files | grep "\(。html \ | .css \ | .js \ | .php \ | .json \ | .sh \)$")
Peter Mark

9

私は以下を使用します:

git grep ^ | wc -l

これはgitによってバージョン管理されたすべてのファイルで^行の先頭を表すregexを検索するため、このコマンドは行の総数を示します。


3

これは私がしました:

git ls-files | xargs file | grep "ASCII" | cut -d : -f 1 | xargs wc -l

これは、リポジトリ内のすべてのテキストファイルを対象のファイルとして数える場合に機能します。一部がドキュメントなどと見なされる場合は、除外フィルターを追加できます。


3

github https://github.com/flosse/slocのこのツールは、より説明的な方法で出力を提供できます。それはあなたのソースコードの統計を作成します:

  • 物理的な線
  • コード行(ソース)
  • コメント付きの行
  • 単一行コメント
  • ブロックコメントのある行
  • ソースとコメントが混ざった行
  • 空行

1

試してください:

find . -type f -name '*.*' -exec wc -l {} + 

問題のディレクトリ/ディレクトリ


0
: | git mktree | git diff --shortstat --stdin

または:

git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin

0

バイナリファイルを含めるかどうかに応じて、2つの解決策があります。

  1. git grep --cached -al '' | xargs -P 4 cat | wc -l
  2. git grep --cached -Il '' | xargs -P 4 cat | wc -l

    「xargs -P 4」は、4つの並列プロセスを使用してファイルを読み取ることができることを意味します。これは、非常に大きなリポジトリをスキャンする場合に非常に役立ちます。マシンの能力によっては、プロセス数を増やすことができます。

    -a、バイナリファイルをテキストとして処理(バイナリを含める)
    -l ''、一致する行ではなくファイル名のみを表示(空でないファイルのみをスキャン)
    -I、バイナリファイルのパターンに一致しない(バイナリを除外)--
    cached、作業ツリーではなくインデックスで検索(コミットされていないファイルを含む)

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