在暂存区中计算文件数量的git命令

85

我正在尝试找出如何轻松计算未提交索引中的文件数量。

我已经尝试过:

git status | grep '#' | wc -l

但有一些以#开头的行并不代表被修改的文件。有更好的方法吗?猜想git status一定有标志可以做到这一点。

即使像GitX这样的工具也不容易让你选择暂存的文件/目录并查看其中有多少个。

9个回答

101

如果你想要一个脚本可以使用的东西:

git diff --cached --numstat | wc -l

如果你想要一些人类可读的东西:

git diff --cached --stat


2
为什么要使用--cached标志? - Nick Humrich
3
问题是关于索引中未提交的文件,这正是--cached显示的内容。如果没有--cached,它会显示已更改但不在索引中的工作目录中的文件(即未暂存的文件)。 - mkarasek
仅需注意,如果更改量很大,则必须以易读的方式向下滚动很长一段时间。我添加了 @fwiw 添加的 | tail -n1,但很遗憾他没有按 OP 要求对索引文件执行操作。 - WORMSS

41

这对我有用:

git status | grep 'modified:' | wc -l

它返回一个数字。


2
而那个数字是“1”。 - Guillochon
1
...或已删除的文件。 - Josh M.

29

就我个人而言,我更喜欢:

git diff --stat | tail -n1

输出结果如下:

10 files changed, 74 insertions(+), 123 deletions(-)

4
顺便提一下,您可以使用--shortstat来代替stat + tail,以"仅输出 --stat 格式的最后一行,包含修改文件的总数、添加行数和删除行数。"的信息。请注意,不要改变原文意思,保持通顺易懂。 - KyleMit

19
尝试使用命令git status -s
git status -s | egrep "^M" | wc -l

^后紧跟M表示一个暂存文件。使用空格分开的^ M表示一个变更但未暂存的文件。


谢谢,那个返回了0但是 git status -s | egrep "^M " | wc -l 运行成功了。我认为正则表达式中的空格需要在"M"的另一侧。 - Bradley
1
啊,同时还要包括其他类型的更改(添加、重命名、创建、删除):git status -s | egrep -c "^[MARCD]" - Bradley
1
我不明白为什么这个答案的投票数这么少。这个答案最容易适应报告所有可能的状态。 - Michael
3
对于我来说,最简单和最好的方法。你还应该考虑添加一个 | -grep -v '^??' 来过滤未暂存的文件。 - cgdave

7

有很多答案可以选择,但是在我的看法中最好的命令是以下的纯本地git命令,它不需要任何管道操作。注意,这将统计已删除、修改和添加的文件:

git diff --cached --shortstat

输出只有一行:
X files changed, Y insertions(+), Z deletions(-)

如果没有进行任何更改,则不会打印任何内容(甚至不会打印一个新的空行)。同样,如何获取未暂存更改的相同结果也很明显(只需省略--cached标志即可)。
git diff --shortstat

1
以下代码可覆盖所有情况(新建、修改、删除甚至未跟踪的),它返回一个数字。
(git status -s |select-string -Pattern "^\s*[A|\?|D|M]" -AllMatches).Matches.Count

1
也许 9 年前它还不可用,但截至 2019 年,ls-filesdiff --stat 更快:
git ls-files --cached | wc -l

根据 git status,零个未提交的更改,但是它显示我已更改了数千个文件。 - derpedy-doo

1

对于任何寻找PowerShell解决方案的人:

(git diff --cached --numstat | Measure-Object -Line).Lines

-1
git --no-pager diff --shortstat <master>

1
欢迎来到Stack Overflow!请阅读[答案]并[编辑]您的答案,以包含解释为什么这段代码实际上可以解决手头的问题。请始终记住,您不仅仅是在解决问题,还在教育提问者和未来的读者。 - undefined
感谢您对Stack Overflow社区做出贡献的兴趣。这个问题已经有很多答案了,其中包括一个经过社区广泛验证的答案。您确定您的方法之前没有被提到过吗?如果是这样的话,能否请您解释一下您的方法有何不同,什么情况下您的方法可能更好,并且/或者为什么您认为之前的答案不够满意。您能否请编辑您的答案并提供解释? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接