我如何计算在一个git存储库中所有文件中出现的总行数?
Git ls-files给了我一个由Git跟踪的文件列表。
我正在找一个命令来隐藏所有这些文件。类似的
git ls-files | [cat all these files] | wc -l
我如何计算在一个git存储库中所有文件中出现的总行数?
Git ls-files给了我一个由Git跟踪的文件列表。
我正在找一个命令来隐藏所有这些文件。类似的
git ls-files | [cat all these files] | wc -l
Xargs会让你把所有文件放在一起,然后把它们传递给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的批处理问题,其中的行数将被分块成多个总行。
从问题中得到一个提示,为什么wc实用程序生成多行“total”?,我发现下面的命令可以绕过这个问题:
wc -l $(git ls-files)
或者如果你只想检查一些文件,例如代码:
Wc -l $(git ls-files | grep '.*\.cs')
对我来说,最好的解决方案就埋在@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文件夹中搜索依赖项。
我在玩cmder (http://gooseberrycreative.com/cmder/),我想计算html,css,java和javascript的行数。虽然上面的一些答案是有效的,或者grep中的模式没有-我在这里(https://unix.stackexchange.com/questions/37313/how-do-i-grep-for-multiple-patterns)发现我必须转义它
这就是我现在用的:
git ls-files | grep " \ (html css |。\ |。js |。java \)美元“| xargs厕所-
我是这样做的:
git ls-files | xargs file | grep "ASCII" | cut -d : -f 1 | xargs wc -l
如果将存储库中的所有文本文件都计算为感兴趣的文件,那么这是可行的。如果其中一些被认为是文档等,则可以添加排除过滤器。
: | git mktree | git diff --shortstat --stdin
Or:
git ls-tree @ | sed '1i\\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin
github https://github.com/flosse/sloc上的这个工具可以以更描述性的方式提供输出。它将创建你的源代码的统计数据:
物理行 代码行数(源代码) 带有注释的行 单行注释 带有块注释的行 代码行与源代码和注释混淆 空行
根据您是否希望包含二进制文件,有两种解决方案。
git grep --cached -al '' | xargs -P 4 cat | wc -l git grep --cached -Il '' | xargs -P 4 cat | wc -l "xargs -P 4" means it can read the files using four parallel processes. This can be really helpful if you are scanning very large repositories. Depending on capacity of the machine you may increase number of processes. -a, process binary files as text (Include Binary) -l '', show only filenames instead of matching lines (Scan only non empty files) -I, don't match patterns in binary files (Exclude Binary) --cached, search in index instead of in the work tree (Include uncommitted files)
如果你想从某个作者那里获得行数,试试下面的代码:
git ls-files "*.java" | xargs -I{} git blame {} | grep ${your_name} | wc -l
如果你想找到非空行总数,你可以使用AWK:
git ls-files | xargs cat | awk '/\S/{x++} END{print "非空行总数:",x}'
它使用regex计算包含非空格字符的行数。
Carl Norum的答案假设没有带空格的文件,IFS的一个字符是制表符和换行符。解决方案是用NULL字节终止该行。
git ls-files -z | xargs -0 cat | wc -l