计算git存储库中的行数


765

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

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

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

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

Answers:


1138

xargs 会做你想要的:

git ls-files | xargs cat | wc -l

但是,有了更多的信息并且可能会更好,您可以:

git ls-files | xargs wc -l

11
我想是微不足道的;如何仅包含源代码文件(例如* .cpp)。我们已提交了一些bin文件:)
丹尼尔(Daniel)

39
然后grep cpp |在之前粘在那里xargs
卡尔·诺鲁姆

35
使用git ls-files -z | xargs -0 wc -l如果您有名称包含空格的文件。
mpontillo

34
对于包括/排除某些文件,请使用: git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -l其中grep部分是您想要的任何perl正则表达式!
加百利

29
如果您只对.java文件感兴趣,可以使用git ls-files | grep "\.java$" | xargs wc -l
dseibert 2014年

352
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

这显示了从空树到当前工作树的差异。发生这种情况是为了计算当前工作树中的所有行。

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

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

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


45
顺便说一句,您可以通过运行来获得该哈希值git hash-object -t tree /dev/null
短暂的2011年

84
甚至更简洁:git diff --stat `git hash-object -t tree /dev/null`
rpetrich

10
这是更好的解决方案,因为它不计算二进制文件,例如上面版本中计算的存档或图像!
BrainStone

31
+1我更喜欢这种解决方案,因为二进制文件不会被计算在内。另外,我们真的只对git diff输出的最后一行感兴趣:git diff --stat `git hash-object -t tree /dev/null` | tail -1
Gabriele Petronella

31
而是使用它git diff --shortstat `git hash-object -t tree /dev/null` 来获取最后一行,不需要尾巴。
Jim Wolff 2014年

316

如果由于要了解项目范围而需要此计数,则可能更喜欢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 -例如,brew install clocHomebrew一起安装

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


4
CLOC忽略某些语言,例如TypeScript。
Marcelo Camargo

6
@MarceloCamargo目前支持TypeScript
Alexander

1
对于初学者,最好执行“ cloc DIRECTORY_WHERE_YOUR_GIT_IN”来计算行数。

完整的描述在这里:github.com/AlDanial/cloc和二进制文件在这里:github.com/AlDanial/cloc/releases/tag/v1.70
Peter Szanto

15
您可以使用cloc --vcs git这些天,这样可以避免某些名称不正确的文件(或过多)的情况。
seanf '17

56

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

从问题中获取提示:wc实用程序为什么生成带有“总计”的多行?,我发现以下命令可以绕过此问题:

wc -l $(git ls-files)

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

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


这很棒,但是对于包含空格的路径来说似乎失败了。有办法解决吗?
Lea Hayes 2014年

1
grep'。* \。m'拾取诸如.mp3,.mp4之类的二进制文件时遇到了麻烦。使用find命令列出代码文件获得了更大的成功wc -l $(git ls-files | find *.m *.h)
Tico Ballagas 2014年

3
@LeaHayes这是一种方式:wc -l --files0-from=<(git ls-files -z)。该<(COMMAND)语法返回其内容的结果的文件的名称COMMAND
2014年

@buck谢谢,但是当我尝试该命令“无法为进程替换创建管道:函数未实现wc:无法识别的选项--files0-from =”时出现错误。有任何想法吗?
Lea Hayes

1
@LeaHayes我想出了一个适合您的脚本:```#!/ bin / bash results = $(git ls-files | xargs -d'\ n'wc -l)let grand_total = 0表示$ in中的x(回显“ $ results” | egrep'[[:digit:]] + total $');不要让grand_total + = $(echo“ $ x” | awk'{print $ 1}')完成echo“ $ {results}” echo“总计:$ {grand_total}”```
buck

45

无论如何,对我而言,最好的解决方案是隐藏在@ephemient答案的注释中。我只是在这里拉起它,以免引起人们的注意。功劳应归功于@FRoZeN(和@ephemient)。

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

返回仓库工作目录中文件和行的总数,没有任何其他噪音。另外,仅对源代码进行计数-二进制文件从计数中排除。

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

git diff --shortstat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

在Windows上也可以。

为了记录,排除空白行的选项,

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

与结合使用时没有任何效果--shortstat。空白行被计数。


1
git mktree </dev/nulltrue|git mktreegit mktree <&-:|git mktree对于我们中间的击键计数器:-)-在回购协议周围漂浮的空树不会伤害任何东西。
jthill

2
人们想知道的是,哈希出蓝色:stackoverflow.com/questions/9765453/...
Tejas的芥兰

19

cloc 1.68开始运行:

cloc --vcs=git


--vcs不适用于我,也许它已被删除。cloc .而在git repo确实有效的时候,OTOH。
acdcjunior

13

我在玩cmder(http://gooseberrycreative.com/cmder/),想统计html,css,java和javascript的行数。虽然上述某些答案有效,但orgrep中的模式却没有-我在这里找到了(/unix/37313/how-do-i-grep-for-multiple-patterns)逃脱

这就是我现在使用的:

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


2
这似乎给了我很大的回应。将您的grep与Justin Aquadro的解决方案结合使用对我来说效果很好。wc -l $(git ls-files | grep“ \(。html \ | .css \ | .js \ | .php \ | .json \ | .sh \)$”)
Peter Mark


3

我这样做:

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

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


3

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

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

1

尝试:

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

在有问题的目录中


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

要么:

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

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,不匹配二进制文件中的模式(排除二进制文件)-已
    缓存,在索引中而不是在工作树中搜索(包括未提交的文件)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.