统计git仓库中的行数

我如何计算git仓库中所有文件中的总行数?

git ls-files给了我一个由git跟踪的文件列表。

我正在寻找一个命令来cat所有这些文件。 就像是

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

xargs会做你想做的事情:

 git ls-files | xargs cat | wc -l 

但有了更多的信息,可能会更好,你可以这样做:

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

这显示了从空树到当前工作树的差异。 当前工作树中的所有行都会被计数。

如果你想要这个计数,因为你想了解项目的范围,你可能更喜欢CLOC的输出(“代码行数”),它给你一个语言的重要和无意义的代码行的细分。

 cloc $(git ls-files) 

(这一行相当于git ls-files | xargs cloc ,它使用sh$()命令replacefunction。)

示例输出:

  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。 你可以用你的软件包pipe理器 brew install cloc ,例如,使用Homebrew进行 brew install cloc

cloc $(git ls-files)通常是对cloc .的改进cloc . 。 例如,上面的示例输出使用git ls-files报告了471行代码。 对于同一个项目, cloc . 报告高达456,279行(需要6分钟运行),因为它在Git忽略的node_modules文件夹中search依赖关系。

我遇到了git ls-files | xargs wc -l批处理问题 git ls-files | xargs wc -l处理大量的文件时,行数将被分成多行。

从问题中获取提示为什么wc实用程序会生成多行“total”? ,我发现下面的命令绕过这个问题:

wc -l $(git ls-files)

或者如果你只想检查一些文件,例如代码:

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

无论如何,最好的解决办法是埋在@ ephemient的回答中。 我只是把它拉到这里,以便它不会被忽视。 这个功劳应该归功于@FRoZeN(和@ephemient)。

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

返回repo工作目录中的文件和行的总数,没有任何额外的噪音。 作为奖励,只有源代码被计算 – 二进制文件被排除在计数器之外。

上面的命令在Linux和OS X上运行。它的跨平台版本是

 git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 

这也适用于Windows。

为了logging,排除空行的选项,

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

--shortstat使用时没有任何影响。 计算空行。

我正在玩cmder( http://gooseberrycreative.com/cmder/ ),我想计算的HTML,CSS,Java和JavaScript的行。 虽然上面的一些答案工作, or模式在grep没有 – 我在这里find( https://unix.stackexchange.com/questions/37313/how-do-i-grep-for-multiple-patterns ),我不得不逃脱它

所以这就是我现在使用的:

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

github https://github.com/flosse/sloc上的这个工具可以以更具描述性的方式给出输出。; 它会创build您的源代码的统计信息:

  • 物理线路
  • 代码行(源代码)
  • 与评论的线
  • 单行评论
  • 带有块注释的行
  • 线路混杂着来源和评论
  • 空行

我使用以下内容:

 git grep ^ | wc -l 

这将search由git版本的所有文件的正则expression式^ ,它代表一行的开始,所以这个命令给出了总的行数!

这是作为cloc 1.68的作品:

cloc --vcs=git

我做到了这一点:

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

如果您将存储库中的所有文本文件计数为感兴趣的文件,则此方法可行。 如果有些被认为是文档等,可以添加一个排除filter。

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

要么:

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