Answers:
xargs
会做你想要的:
git ls-files | xargs cat | wc -l
但是,有了更多的信息并且可能会更好,您可以:
git ls-files | xargs wc -l
grep cpp |
在之前粘在那里xargs
。
git ls-files -z | xargs -0 wc -l
如果您有名称包含空格的文件。
git ls-files | grep -P ".*(hpp|cpp)" | xargs wc -l
其中grep部分是您想要的任何perl正则表达式!
git ls-files | grep "\.java$" | xargs wc -l
git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904
这显示了从空树到当前工作树的差异。发生这种情况是为了计算当前工作树中的所有行。
要获取当前工作树中的数字,请执行以下操作:
git diff --shortstat `git hash-object -t tree /dev/null`
它会给你一个像这样的字符串1770 files changed, 166776 insertions(+)
。
git hash-object -t tree /dev/null
。
git diff --stat `git hash-object -t tree /dev/null`
git diff --stat `git hash-object -t tree /dev/null` | tail -1
git diff --shortstat `git hash-object -t tree /dev/null`
来获取最后一行,不需要尾巴。
如果由于要了解项目范围而需要此计数,则可能更喜欢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 cloc
与Homebrew一起安装。
cloc $(git ls-files)
通常是对的改进cloc .
。例如,上面的示例输出git ls-files
报告了471行代码。对于同一项目,cloc .
报告高达456,279行(需要六分钟的时间运行),因为它会在忽略Git的node_modules
文件夹中搜索依赖项。
cloc --vcs git
这些天,这样可以避免某些名称不正确的文件(或过多)的情况。
我git ls-files | xargs wc -l
在处理大量文件时遇到批处理问题,其中行数将分成多total
行。
从问题中获取提示:wc实用程序为什么生成带有“总计”的多行?,我发现以下命令可以绕过此问题:
wc -l $(git ls-files)
或者,如果您只想检查一些文件,例如代码:
wc -l $(git ls-files | grep '.*\.cs')
wc -l $(git ls-files | find *.m *.h)
wc -l --files0-from=<(git ls-files -z)
。该<(COMMAND)
语法返回其内容的结果的文件的名称COMMAND
。
无论如何,对我而言,最好的解决方案是隐藏在@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
。空白行被计数。
git mktree </dev/null
或true|git mktree
或git mktree <&-
或 :|git mktree
对于我们中间的击键计数器:-)-在回购协议周围漂浮的空树不会伤害任何东西。
我在玩cmder(http://gooseberrycreative.com/cmder/),想统计html,css,java和javascript的行数。虽然上述某些答案有效,但or
grep中的模式却没有-我在这里找到了(/unix/37313/how-do-i-grep-for-multiple-patterns)逃脱
这就是我现在使用的:
git ls-files | grep "\(.html\|.css\|.js\|.java\)$" | xargs wc -l
我使用以下内容:
git grep ^ | wc -l
这将在git版本化的所有文件中搜索regex ^
,它表示一行的开头,因此此命令给出了总行数!
我这样做:
git ls-files | xargs file | grep "ASCII" | cut -d : -f 1 | xargs wc -l
如果将存储库中的所有文本文件都计为感兴趣的文件,则此方法有效。如果某些文档被认为是文档等,则可以添加排除过滤器。
github https://github.com/flosse/sloc上的此工具可以以更具描述性的方式提供输出。它将创建您的源代码的统计信息:
: | git mktree | git diff --shortstat --stdin
要么:
git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin
根据您是否要包含二进制文件,有两种解决方案。
git grep --cached -al '' | xargs -P 4 cat | wc -l
git grep --cached -Il '' | xargs -P 4 cat | wc -l
“ xargs -P 4”表示它可以使用四个并行进程读取文件。如果要扫描非常大的存储库,这将非常有用。根据机器的容量,您可能会增加处理数量。
-a,将二进制文件处理为文本(包括二进制文件)
-l”,仅显示文件名而不是匹配行(仅扫描非空文件)
-I,不匹配二进制文件中的模式(排除二进制文件)-已
缓存,在索引中而不是在工作树中搜索(包括未提交的文件)