The behavior of "git diff --stat" is rather odd for files that have
zero lines of changes: it will discount them entirely unless they were

Which means that the stat output will simply not show files that only
had "other" changes: they were created or deleted, or their mode was

Now, those changes do show up in the summary, but so do renames, so
the diffstat logic is inconsistent. Why does it show renames with zero
lines changed, but not mode changes or added files with zero lines

So change the logic to not check for "is_renamed", but for
"is_interesting" instead, where "interesting" is judged to be any
action but a pure data change (because a pure data change with zero
data changed really isn't worth showing, if we ever get one in our

So if you did

   chmod +x Makefile
   git diff --stat

before, it would show empty (" 0 files changed"), with this it shows

 Makefile | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

which I think is a more correct diffstat (and then with "--summary" it
shows *what* the metadata change to Makefile was - this is completely
consistent with our handling of renamed files).

Side note: the old behavior was *really* odd. With no changes at all,
"git diff --stat" output was empty. With just a chmod, it said "0
files changed". No way is our legacy behavior sane.

Signed-off-by: Linus Torvalds <>

This was triggered by kernel developers not noticing that they had
added zero-sized files, because those additions never showed up in the

NOTE! This does break two of our tests, so we clearly did this on
purpose, or at least tested for it. I just uncommented the subtests
that this makes irrelevant, and changed the output of another one.

Another test was simply buggy. It used "git diff --root cmit", and
thought that would be the diff against root. It isn't, and never has
been. It just happened to give the same (no file) output before.
Fixing --stat to show new files showed how buggy the test was. The
"--root" thing matters for "git show" or "git log" (when showing a
root commit) and for "git diff-tree" with a single tree.

Maybe we would *want* to make "git diff --root <cmit>" be the "diff
between root and cmit", but that's not what it actually is.


Attachment: patch.diff
Description: Binary data

Reply via email to