web-dev-qa-db-ja.com

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

Gitリポジトリ内のすべてのファイルに含まれる総行数をどのように数えますか?

git ls-filesは私にgitによって追跡されたファイルのリストを与えます。

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

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

xargsはあなたが望むことをするでしょう:

git ls-files | xargs cat | wc -l

しかし、もっと多くの情報があれば、おそらくもっと良いことができます。

git ls-files | xargs wc -l
990
Carl Norum
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

これは空のツリーと現在の作業ツリーとの違いを示しています。これはあなたの現在の作業ツリーのすべての行を数えるために起こります。

現在の作業ツリーの番号を取得するには、これを行います。

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

それはあなたに1770 files changed, 166776 insertions(+)のような文字列を与えるでしょう。

310
ephemient

プロジェクトの範囲を把握したいためにこのカウントが必要な場合は、 _ cloc _ (“ Count Lines of Code”)の出力をお勧めします。言語によるコード行。

cloc $(git ls-files)

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

出力例:

      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をインストールすることができます - 例えば Homebrew を付けたbrew install cloc

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

273
Rory O'Kane

多数のファイルを扱うときにgit ls-files | xargs wc -lでバッチ処理の問題に遭遇しました。そこでは行数が複数のtotal行にまとめられます。

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

wc -l $(git ls-files)

あるいは、いくつかのファイルだけを調べたい場合は、コード:

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

49
Justin Aquadro

とにかく、最善の解決策は@ 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と併用しても効果はありません。空白行はカウントされます。

37
hashchange

これは cloc 1.68以降で動作します。

cloc --vcs=git

13
kes

私はcmder( http://gooseberrycreative.com/cmder/ )で遊んでいて、html、css、Java、およびjavascriptの行を数えたいと思っていましたが、grepのorパターンはうまくいきました。しなかった - 私はそれをエスケープしなければならなかったことをここに見つけた( https://unix.stackexchange.com/questions/37313/how-do-i-grep-for-multiple-patterns

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

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

8

私は以下を使います:

git grep ^ | wc -l

これは、gitによってバージョン管理されているすべてのファイルで正規表現^を検索します。これは行の始まりを表しているので、このコマンドは合計行数を示します。

6

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

  • 物理回線
  • コード行(ソース)
  • コメント付きの行
  • 単一行コメント
  • ブロックコメント付きの行
  • ソースとコメントが混在する行
  • 空行
3
love

これは私がしました:

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

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

2
Sasha Pachev
: | git mktree | git diff --shortstat --stdin

または

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

試してください:

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

問題のディレクトリ

0
Theos