计算git存储库中的行数

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

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

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

git ls-files | [cat all these files] | wc -l
495092 次浏览

xargs会让你cat所有的文件一起传递给wc之前,像你问:

git ls-files | xargs cat | wc -l

但是跳过中间cat会给你更多的信息,可能更好:

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

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

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

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

它会给你一个像1770 files changed, 166776 insertions(+)这样的字符串。

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

根据问题为什么wc实用程序生成多行与“总”?的提示,我找到了以下命令来绕过这个问题:

wc -l $(git ls-files)

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

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

无论如何,对我来说,最好的解决方案隐藏在@ephelient的答案的评论中。我只是把它拉到这里,这样它就不会被忽视。这应该归功于@FRoZeN(和@ephelient)。

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#2命令替换特性。)

示例输出:

      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            309JSON                             3              0              0             58HTML                             2              7             12             50Handlebars                       2              0              0             37CoffeeScript                     4              1              4             12SASS                             1              1              1              5-------------------------------------------------------------------------------SUM:                            14             22            128            471-------------------------------------------------------------------------------

您必须先安装CLOC。您可能会使用包管理器安装#0-例如,brew install cloc自制

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

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

我这样做:

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

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

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

或:

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

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

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

我使用以下内容:

git grep ^ | wc -l

这将搜索由git版本控制的所有文件的regex^,它表示一行的开头,因此此命令给出了总行数!

这是从cloc 1.68开始的:

cloc --vcs=git

尝试:

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

在有问题的目录/目录上

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

  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",只显示文件名而不是匹配行(只扫描非空文件)
    -我,不匹配二进制文件中的模式(不包括二进制)
    --缓存,在索引中而不是在工作树中搜索(包括未提交的文件)

如果您想从某个作者处获取行数,请尝试以下代码:

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

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

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

这使用regex来计算包含非空白字符的行。

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

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