回答:
xargs
あなたが望むことをします:
git ls-files | xargs cat | wc -l
しかし、より多くの情報を使用して、おそらくより良い方法で、次のことができます。
git ls-files | xargs wc -l
grep cpp |
その前にそこに留まってくださいxargs
。
git ls-files -z | xargs -0 wc -l
名前にスペースが含まれるファイルがある場合に使用します。
git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -l
は、次のよう にします。grepの部分は、必要なperlの正規表現です。
git ls-files | grep "\.java$" | xargs wc -l
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904
これは、空のツリーと現在の作業ツリーの違いを示しています。これはたまたま現在の作業ツリーのすべての行を数えます。
現在の作業ツリーの数値を取得するには、次のようにします。
git diff --shortstat `git hash-object -t tree /dev/null`
それはあなたにのような文字列を与えます1770 files changed, 166776 insertions(+)
。
git hash-object -t tree /dev/null
ます。
git diff --stat `git hash-object -t tree /dev/null`
git diff --stat `git hash-object -t tree /dev/null` | tail -1
git diff --shortstat `git hash-object -t tree /dev/null`
に、最終行を取得するために使用します。テールは必要ありません。
プロジェクトのスコープを把握するためにこの数が必要な場合は、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分かかります)。
cloc --vcs git
最近使用するだけで、不適切な名前のファイル(またはファイルが多すぎる)のいくつかのエッジケースを回避できます。
git ls-files | xargs wc -l
多数のファイルを処理するときにバッチ処理の問題が発生しました。この場合、行数が複数のtotal
行に分割されます。
質問からヒントを得るなぜwcユーティリティは「合計」で複数の行を生成するのですか?、問題を回避する次のコマンドを見つけました。
wc -l $(git ls-files)
または、コードなどの一部のファイルのみを調べたい場合:
wc -l $(git ls-files | grep '.*\.cs')
wc -l $(git ls-files | find *.m *.h)
wc -l --files0-from=<(git ls-files -z)
。<(COMMAND)
構文は、内容の結果であるファイルの名前を返しますCOMMAND
。
とにかく、私にとっての最良の解決策は、@ 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
。空白行がカウントされます。
git mktree </dev/null
またはtrue|git mktree
またはgit mktree <&-
または :|git mktree
私たちの間のキーストロークカウンター:-)-リポジトリの周りに浮かぶ予備の空の木は何も傷つけません。
これはcloc 1.68以降で機能します。
cloc --vcs=git
--vcs
うまくいきませんでした。おそらく削除されました。cloc .
git repoで作業している間、OTOH。
私は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
私は以下を使用します:
git grep ^ | wc -l
これはgitによってバージョン管理されたすべてのファイルで^
行の先頭を表すregexを検索するため、このコマンドは行の総数を示します。
github https://github.com/flosse/slocのこのツールは、より説明的な方法で出力を提供できます。それはあなたのソースコードの統計を作成します:
: | git mktree | git diff --shortstat --stdin
または:
git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin
バイナリファイルを含めるかどうかに応じて、2つの解決策があります。
git grep --cached -al '' | xargs -P 4 cat | wc -l
git grep --cached -Il '' | xargs -P 4 cat | wc -l
「xargs -P 4」は、4つの並列プロセスを使用してファイルを読み取ることができることを意味します。これは、非常に大きなリポジトリをスキャンする場合に非常に役立ちます。マシンの能力によっては、プロセス数を増やすことができます。
-a、バイナリファイルをテキストとして処理(バイナリを含める)
-l ''、一致する行ではなくファイル名のみを表示(空でないファイルのみをスキャン)
-I、バイナリファイルのパターンに一致しない(バイナリを除外)--
cached、作業ツリーではなくインデックスで検索(コミットされていないファイルを含む)