关于bash:计算git存储库中的行数

Count number of lines in a git repository

我如何计算Git存储库中所有文件中的总行数?

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

我在找一个命令给cat所有这些文件。类似的东西

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

xargs将按您的要求执行:

1
git ls-files | xargs cat | wc -l

但是有了更多的信息,也许更好,你可以做到:

1
git ls-files | xargs wc -l


1
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

这将显示空树与当前工作树之间的差异。它会计算当前工作树中的所有行。

要获取当前工作树中的数字,请执行以下操作:

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

它会给你一个类似于1770 files changed, 166776 insertions(+)的字符串。


如果您希望这个计数是因为您想要了解项目的范围,那么您可能更喜欢CLOC("计数代码行")的输出,它会按语言对重要和不重要的代码行进行细分。

1
cloc $(git ls-files)

(这条线相当于git ls-files | xargs cloc。它使用了sh$()命令替换功能。)

样品输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      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 .报告了高达456279行(运行需要6分钟),因为它搜索git忽略node_modules文件夹中的依赖项。


我在处理大量文件时遇到了git ls-files | xargs wc -l的批处理问题,其中行计数将被分块到多个total行中。

从问题中得出一个提示:为什么wc实用程序生成多条"total"行?,我发现以下命令可以绕过此问题:

wc -l $(git ls-files)

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

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


不管怎样,对我来说,最好的解决办法就藏在@ephemient答案的评论中。我只是把它拉到这里,这样它就不会被忽视。这项信贷应该转到@frozed(和@ephemient)。

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

返回repo工作目录中的文件和行的总数,无任何其他噪声。另外,只计算源代码-二进制文件不包括在计数中。

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

1
git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

也适用于Windows。

对于记录,排除空行的选项,

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

--shortstat一起使用时没有任何效果。空行计数。


从CLOC 1.68起:

cloc --vcs=git


我在玩CMDER(HTTP://GooSeBeReRealviv.COM/CMDRe/),我想计算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


我使用以下方法:

1
git grep ^ | wc -l

这将搜索Git版本的所有文件中的regex ^,它代表一行的开始,所以这个命令给出了总行数!


github上的这个工具https://github.com/flosse/sloc可以以更具描述性的方式提供输出。它将创建源代码的状态:

  • 物理线
  • 代码行(源)
  • 带注释的行
  • 单行注释
  • 带块注释的行
  • 与源代码和注释混在一起的行
  • 空行

我这样做了:

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

如果您将存储库中的所有文本文件都算作感兴趣的文件,则可以使用此方法。如果一些被视为文档等,则可以添加排除筛选器。


尝试:

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

在相关目录上


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

或:

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