我如何计算Git存储库中所有文件中的总行数?
git ls-files给了我一份git跟踪的文件列表。
我在找一个命令给cat所有这些文件。类似的东西
1
| git ls-files | [cat all these files] | wc -l |
xargs将按您的要求执行:
1
| git ls-files | xargs cat | wc -l |
但是有了更多的信息,也许更好,你可以做到:
1
| git ls-files | xargs wc -l |
- 当您的存储库中有符号链接时,这将加倍计算。不过,这也许不是一个问题。
- 我觉得这很简单;只包含源代码文件(如*.cpp)如何?我们提交了一些bin文件:)
- 把grep cpp |插在xargs之前,然后。
- 我想提到后者(GitLS文件xargs wc-l)在WindowsPoweshell中的GitHub安装中工作。
- 如果文件名中有空格,请使用git ls-files -z | xargs -0 wc -l。
- 这还包括图像。我的存储库中的一个jpeg图像显然有15176行文本。
- 为了将来使用,您可以将它作为别名放在您的~/.gitconfig中:count = ! git ls-files | xargs wc -l。然后您可以通过git count调用它。
- 就其价值而言,-l是一个小写L,而不是数字1。
- 对于包括/排除某些文件,请使用:git ls-files | grep -P".*(hpp|cpp)" | xargs wc -l,其中grep部分是您想要的任何perl regex!
- 如果您对.java文件感兴趣,可以使用EDCOX1×8
- 统计bin文件(png/gif/etc)中的"行数"…:(
- 'xargs' is not recognized as an internal or external command, operable program or batch file.
- @imray错误来自Windows命令提示符,这个问题被标记为bash,这是一个*nix环境。尝试使用cygwin,或查看cloc:sourceforge.net/projects/cloc
- 已在Mac上尝试此命令,但出现"xargs:wc:参数列表太长"错误。是因为git回购太大了吗?
- @史,可能是的,是的。检查xargs手册页以限制传递的参数数量。
- 如果您想找到python文件的代码行,那么在macs上的命令是ls-files | grep -e".*py" | xargs wc -l。不要使用-P,模式是-e。
- @Carlnorum在这个计算中是否显示了所有分支的行总数,如果是的话,我们如何只得到特定分支的行数,比如master。
- git ls-files | grep -vE"(png|jpg|ico)" | xargs wc -l--有一个排除您不需要的各种文件类型的例子;毕竟我们正在计算行数。这是在Mac和Ubuntu上测试的。
- git ls-files | sed 's/ /\\ /g' | grep -E"\.*(swift$|mm$)" | xargs wc -l使用sed来转义文件或路径中有空格。
- 文件名中只有单引号时不起作用
- 我很确定这是错误的——任何知道更多信息的人都可以纠正我的错误,但这肯定会列出存储库中的文件名,但实际上会计算这些文件签出版本中的行数。因此,如果文件的大小发生了变化,那么总数将是错误的。
1
| git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904 |
这将显示空树与当前工作树之间的差异。它会计算当前工作树中的所有行。
要获取当前工作树中的数字,请执行以下操作:
1
| 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输出的最后一行非常感兴趣:git diff --stat `git hash-object -t tree /dev/null` | tail -1。
- 有没有办法不计算只包含空白的行?
- @卡梅隆·马丁·埃多克斯(Cameron Martin EDOCX1)(22)
- 相反,使用git diff --shortstat `git hash-object -t tree /dev/null` 获得最后一行,不需要尾部。
- 有人能解释一下4B825DC642CB6EB9A60E54BF8D69288FBEE4904是什么意思吗?…
- @它是空树的对象ID,git hash-object -t tree /dev/null。即使空树从未出现在存储库历史记录中的提交中,Git也会硬编码来识别它;在源代码中查找EMPTY_TREE_SHA1。
- @以弗所:吉特差异能做什么?我是说-w是什么意思?
- @我只是短暂地找到了埃多克斯1〔26〕。
- 只需记住哈希;-)使用sha1("tree 0 ")=4b825dc642cb6eb9a060e54bf8d6928fbee4904( 是nul字符)
- @zack -w表示Ignore whitespace when comparing lines. This ignores differences even if one line has whitespace where the other line has none.见文件[git scm.com/docs/git diff]
- @rpetrich git diff --stat git hash object-t tree/dev/null`我可以理解``用于在git命令内部运行git命令,但是你能引导我到一个资源来了解这种其他命令吗,因为我无法通过搜索找到任何命令
- @上面代码中的ephemient是否计算repo中存在的所有分支中的所有代码行。如果是,那么在主分支中只获取代码行的选项是什么?
如果您希望这个计数是因为您想要了解项目的范围,那么您可能更喜欢CLOC("计数代码行")的输出,它会按语言对重要和不重要的代码行进行细分。
(这条线相当于git ls-files | xargs cloc。它使用了sh的$()命令替换功能。)
样品输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 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。
cloc $(git ls-files)通常比cloc .有所改善。例如,上面带git ls-files的示例输出报告了471行代码。对于同一个项目,cloc .报告了高达456279行(运行需要6分钟),因为它搜索git忽略node_modules文件夹中的依赖项。
- 现在您只需使用cloc --vcs git,这样就避免了一些带有名字不好的文件(或文件太多)的边缘情况。
- @如果你仔细阅读的话,它就写在那里,blank、comment和code。
- 这是否泄漏代码?我指的是Github的证书
- @当然没有。cloc计算本地目录中的文件行数,而不访问网络。它甚至不知道代码是否来自Github。
- @罗里约·凯恩谢谢你的澄清:)干杯
- 哇,这完全让人震惊。曾经使用过wc和grep,但从现在起不会再使用了。)
- CLOC忽略了一些语言,例如typescript。
- @此时支持marcelocamargo类型脚本
- 对于初学者,最好执行"CLOC目录"来计算行数。
- 完整描述如下:github.com/aldanial/cloc,二进制文件如下:github.com/aldanial/cloc/releases/tag/v1.70
- @Roryo'kane在这里,我们如何知道在这个过程中被忽略的文件是什么,是否会有一些代码文件属于这个范围?
- @Kasunsiyambalapitiya您可以在CLOC的文档中找到这些问题的答案。正如CLOC的自述文件所说,传递--ignored=FILE将"保存被忽略文件的名称以及它们被忽略到文件中的原因"。
- 只是一个旁注,它不计算所有行,它不包括空行和只包含注释的行。
我在处理大量文件时遇到了git ls-files | xargs wc -l的批处理问题,其中行计数将被分块到多个total行中。
从问题中得出一个提示:为什么wc实用程序生成多条"total"行?,我发现以下命令可以绕过此问题:
wc -l $(git ls-files)
或者如果您只想检查一些文件,例如代码:
wc -l $(git ls-files | grep '.*\.cs')
- 这很好,但对于包含空格的路径来说似乎失败了。有办法解决这个问题吗?
- grep'.*.m'无法获取.mp3,.mp4等二进制文件。使用find命令列出代码文件wc -l $(git ls-files | find *.m *.h)取得了更大的成功
- @Leahayes这是一条路:wc -l --files0-from=<(git ls-files -z)。<(COMMAND)语法返回内容是COMMAND结果的文件名。
- @谢谢,但是当我尝试该命令"无法为进程替换生成管道:函数未实现wc:unrecognized option--files0 from=''时,会得到一个错误。有什么想法吗?
- @Leahayes你在使用什么操作系统/终端?更重要的是,您使用的是什么版本的wc?GNU wc为我工作。你可以试着下载它来让它正常工作。
- @buck与sourcetree for windows一起分发的bash shell中包含的版本。"wc(gnu textuils)2.0"。
- @Leahayes我想出了这个脚本,我认为它对你很有用:"``!"/bin/bash results=$(git ls files xargs-d''wc-l)让grand_total=0代表x in$(echo"$results"egup'[[:digit:]+total$');do let grand_total+=$(echo"$x"awk'print$1')done echo"$"results"echo"总计:$grand"```
- 带xargs的-n开关可用于增加一个块内的最大行数。
不管怎样,对我来说,最好的解决办法就藏在@ephemient答案的评论中。我只是把它拉到这里,这样它就不会被忽视。这项信贷应该转到@frozed(和@ephemient)。
1
| git diff --shortstat `git hash-object -t tree /dev/null` |
返回repo工作目录中的文件和行的总数,无任何其他噪声。另外,只计算源代码-二进制文件不包括在计数中。
上面的命令在Linux和OS X上工作。它的跨平台版本是
1
| 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用于我们中间的击键计数器:一个备用的空树在回购中浮动不会伤害任何东西。
- 对于那些想知道这是什么的人:stackoverflow.com/questions/9765453/&hellip;
从CLOC 1.68起:
cloc --vcs=git
我在玩CMDER(HTTP://GooSeBeReRealviv.COM/CMDRe/),我想计算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
- 这似乎对我有很大的影响。把你的grep和justin aquadro的解决方案结合使用对我来说效果很好。wc-l$(git ls文件grep(.html.css.js.php.json.sh)$)
- @彼得马克,你评论中的解决方案对我有效
我使用以下方法:
这将搜索Git版本的所有文件中的regex ^,它代表一行的开始,所以这个命令给出了总行数!
github上的这个工具https://github.com/flosse/sloc可以以更具描述性的方式提供输出。它将创建源代码的状态:
- 物理线
- 代码行(源)
- 带注释的行
- 单行注释
- 带块注释的行
- 与源代码和注释混在一起的行
- 空行
我这样做了:
1
| git ls-files | xargs file | grep"ASCII" | cut -d : -f 1 | xargs wc -l |
如果您将存储库中的所有文本文件都算作感兴趣的文件,则可以使用此方法。如果一些被视为文档等,则可以添加排除筛选器。
尝试:
1
| find . -type f -name '*.*' -exec wc -l {} + |
在相关目录上
1
| : | git mktree | git diff --shortstat --stdin |
或:
1
| git ls-tree @ | sed '1i\' | git mktree --batch | xargs | git diff-tree --shortstat --stdin |