我如何计算在一个git存储库中所有文件中出现的总行数?

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

我正在找一个命令来隐藏所有这些文件。类似的

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

当前回答

我使用以下方法:

git grep ^ | wc -l

这将搜索由git控制的所有文件的regex ^,它表示一行的开始,所以这个命令给出了总行数!

其他回答

Carl Norum的答案假设没有带空格的文件,IFS的一个字符是制表符和换行符。解决方案是用NULL字节终止该行。

 git ls-files -z | xargs -0 cat | wc -l

对我来说,最好的解决方案就埋在@ephemient回答的评论里。我只是把它拉上来,这样就不会被忽视了。这都要归功于@FRoZeN(和@ephemient)。

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

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

上面的命令适用于Linux和OS x,其跨平台版本是

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

这在Windows上也适用。

声明一下,排除空行的选项,

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

当与——shortstat一起使用时没有任何影响。空行被计数。

如果您想要这个计数是因为您想要了解项目的范围,那么您可能更喜欢CLOC(“计算代码行数”)的输出,它按语言给出了重要代码行和不重要代码行的分类。

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,例如,用Homebrew安装cloc。

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

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

Or:

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

我使用以下方法:

git grep ^ | wc -l

这将搜索由git控制的所有文件的regex ^,它表示一行的开始,所以这个命令给出了总行数!