计算git存储库中的行数

时间:2011-01-27 22:07:06

标签: bash git shell line-count

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

git ls-files为我提供了git跟踪的文件列表。

我正在寻找cat所有这些文件的命令。像

这样的东西
git ls-files | [cat all these files] | wc -l

17 个答案:

答案 0 :(得分:997)

xargs会做你想做的事:

git ls-files | xargs cat | wc -l

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

git ls-files | xargs wc -l

答案 1 :(得分:310)

git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

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

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

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

它会为您提供类似1770 files changed, 166776 insertions(+)的字符串。

答案 2 :(得分:274)

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

cloc $(git ls-files)

(此行相当于git ls-files | xargs cloc。它使用sh的{​​{3}}功能。)

示例输出:

      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。您可以$() command substitution - 例如brew install cloc install cloc with your package manager

cloc $(git ls-files)通常比cloc .有所提升。例如,上面带有git ls-files的示例输出报告了471行代码。对于同一个项目,cloc .报告高达456,279行(并且需要6分钟才能运行),因为它会搜索Git忽略的node_modules文件夹中的依赖项。

答案 3 :(得分:49)

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

从问题Why does the wc utility generate multiple lines with "total"?收到提示,我发现以下命令可以绕过这个问题:

wc -l $(git ls-files)

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

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

答案 4 :(得分:37)

无论如何,对我来说最好的解决方案都埋没在@ 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一起使用时没有任何效果。空白行计算在内。

答案 5 :(得分:13)

这适用于cloc 1.68:

cloc --vcs=git

答案 6 :(得分:8)

我正在玩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

答案 7 :(得分:6)

我使用以下内容:

git grep ^ | wc -l

这将搜索由git版本化的正则表达式^的所有文件,它代表一行的开头,因此该命令给出总行数!

答案 8 :(得分:3)

github https://github.com/flosse/sloc上的此工具可以更具描述性的方式提供输出。它将创建源代码的统计信息:

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

答案 9 :(得分:2)

我这样做了:

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

如果您将存储库中的所有文本文件都计为感兴趣的文件,则此方法有效。如果某些被认为是文档等,则可以添加排除过滤器。

答案 10 :(得分:1)

卡尔·诺鲁姆(Carl Norum)的答案假设没有带空格的文件,其中IFS的字符之一为tabnewline。解决方法是用NULL字节终止行。

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

答案 11 :(得分:0)

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

或者:

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

答案 12 :(得分:0)

尝试:

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

在有问题的目录/目录上

答案 13 :(得分:0)

根据是否要包含二进制文件,有两种解决方案。

  1. git grep --cached -al '' | xargs -P 4 cat | wc -l
  2. git grep --cached -Il '' | xargs -P 4 cat | wc -l

    “ xargs -P 4”表示它可以使用四个并行进程读取文件。如果要扫描非常大的存储库,这将非常有用。根据机器的容量,您可能会增加进程数。

    -a,将二进制文件作为文本处理(包括二进制文件)
    -l'',仅显示文件名而不是匹配行(仅扫描非空文件)
    -I,不匹配二进制文件中的模式(排除二进制文件)
    --cached,在索引中而不是在工作树中搜索(包括未提交的文件)

答案 14 :(得分:0)

如果要从某个作者那里获得行数,请尝试以下代码:

git ls-files "*.java" | xargs -I{} git blame {} | grep ${your_name} | wc -l

答案 15 :(得分:0)

如果要查找非空行的总数,可以使用AWK:

git ls-files | xargs cat | awk '/\S/{x++} END{print "Total number of non-empty lines:", x}'

这使用正则表达式对包含非空格字符的行进行计数。

答案 16 :(得分:0)

以下片段来自

mandiwise/Count lines in Git repo

在 Windows 10 上使用 Git Bash 对我有用

git ls-files | xargs wc -l

给定的命令将输出一个文件列表,其中包含每个文件的 sloc 计数和 repo 的 sloc 总数。