我如何计算在一个git存储库中所有文件中出现的总行数?

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

我正在找一个命令来隐藏所有这些文件。类似的

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

当前回答

Carl Norum的答案假设没有带空格的文件,IFS的一个字符是制表符和换行符。解决方案是用NULL字节终止该行。

 git ls-files -z | xargs -0 cat | wc -l

其他回答

对我来说,最好的解决方案就埋在@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一起使用时没有任何影响。空行被计数。

我是这样做的:

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

如果将存储库中的所有文本文件都计算为感兴趣的文件,那么这是可行的。如果其中一些被认为是文档等,则可以添加排除过滤器。

Carl Norum的答案假设没有带空格的文件,IFS的一个字符是制表符和换行符。解决方案是用NULL字节终止该行。

 git ls-files -z | xargs -0 cat | wc -l

在处理大量文件时,我遇到过git ls-files | xargs wc -l的批处理问题,其中的行数将被分块成多个总行。

从问题中得到一个提示,为什么wc实用程序生成多行“total”?,我发现下面的命令可以绕过这个问题:

wc -l $(git ls-files)

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

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

git diff --stat 4b825dc642cb6eb9a060e54bf8d69288fbee4904

这显示了从空树到当前工作树的差异。它恰好计算当前工作树中的所有行。

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

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

它会给你一个字符串,比如1770 files changed, 166776 insertions(+)。