我如何计算git存储库中所有文件中存在的总行数?
git ls-files
为我提供了git跟踪的文件列表。
我正在寻找cat
所有这些文件的命令。像
git ls-files | [cat all these files] | wc -l
答案 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
的字符之一为tab
和newline
。解决方法是用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)
根据是否要包含二进制文件,有两种解决方案。
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,不匹配二进制文件中的模式(排除二进制文件)
--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 总数。