threads / discuss / 17108

"git diff --stat" doesn't show added empty file

Subject: "git diff --stat" doesn't show added empty file

## tl;dr

6 messages between Jan 12, 2009 and Jan 13, 2009.

replies: 5people: 4as markdown or json

Ping Yin· Jan 12, 2009, 03:36 UTC · lore
$ git --version
git version 1.6.1.9.g97c34
$ mkdir test && cd test && git init && git commit --allow-empty -m
"Initial commit"
$ touch .gitignore && git add .gitignore && git commit -m "Add empty .gitignore"
$ git diff --stat HEAD^..
 0 files changed, 0 insertions(+), 0 deletions(-)
May be the following is better?
 .gitignore |    0 +
 1 files changed, 0 insertions(+), 0 deletions(-)
Ping Yin
Johannes Schindelin· Jan 12, 2009, 12:19 UTC · re: Ping Yin · lore

Re: "git diff --stat" doesn't show added empty file

Hi,
On Mon, 12 Jan 2009, Ping Yin wrote:
Show 12 quoted lines
> $ git --version
> git version 1.6.1.9.g97c34
> $ mkdir test && cd test && git init && git commit --allow-empty -m
> "Initial commit"
> $ touch .gitignore && git add .gitignore && git commit -m "Add empty .gitignore"
> $ git diff --stat HEAD^..
>  0 files changed, 0 insertions(+), 0 deletions(-)
> 
> May be the following is better?
> 
>  .gitignore |    0 +
>  1 files changed, 0 insertions(+), 0 deletions(-)
Have fun coding that.

Ciao, Dscho

Michael J Gruber· Jan 12, 2009, 15:41 UTC · re: Johannes Schindelin · lore

Re: "git diff --stat" doesn't show added empty file

Johannes Schindelin venit, vidit, dixit 01/12/09 13:19:
Show 18 quoted lines
> Hi,
> 
> On Mon, 12 Jan 2009, Ping Yin wrote:
> 
>> $ git --version
>> git version 1.6.1.9.g97c34
>> $ mkdir test && cd test && git init && git commit --allow-empty -m
>> "Initial commit"
>> $ touch .gitignore && git add .gitignore && git commit -m "Add empty .gitignore"
>> $ git diff --stat HEAD^..
>>  0 files changed, 0 insertions(+), 0 deletions(-)
>>
>> May be the following is better?
>>
>>  .gitignore |    0 +
>>  1 files changed, 0 insertions(+), 0 deletions(-)
> 
> Have fun coding that.

Removing 5 lines from diff.c does the job, except for the " +" after 0, but I don't know if that output is really better. Is the addition/removal of an empty file a file change? It's certainly a change of the containing dir, which git does not track. I don't see how to distinguish addition from removal of an empty file at that point in the code yet. This might be the "fun" part...

Michael
Johannes Schindelin· Jan 13, 2009, 11:27 UTC · re: Michael J Gruber · lore

Re: "git diff --stat" doesn't show added empty file

Hi,
On Mon, 12 Jan 2009, Michael J Gruber wrote:
Show 20 quoted lines
> Johannes Schindelin venit, vidit, dixit 01/12/09 13:19:
> 
> > On Mon, 12 Jan 2009, Ping Yin wrote:
> > 
> >> $ git --version
> >> git version 1.6.1.9.g97c34
> >> $ mkdir test && cd test && git init && git commit --allow-empty -m
> >> "Initial commit"
> >> $ touch .gitignore && git add .gitignore && git commit -m "Add empty .gitignore"
> >> $ git diff --stat HEAD^..
> >>  0 files changed, 0 insertions(+), 0 deletions(-)
> >>
> >> May be the following is better?
> >>
> >>  .gitignore |    0 +
> >>  1 files changed, 0 insertions(+), 0 deletions(-)
> > 
> > Have fun coding that.
> 
> Removing 5 lines from diff.c does the job,
I can only think that you mean these lines:
                else if (!data->files[i]->is_renamed &&
                         (added + deleted == 0)) {
                        total_files--;
                        continue;
                }
However, they are also present in the initial stat code in d75f7952:
                } else if (added + deleted == 0) {
                        total_files--;
                        continue;
                }

Now, the fun part is finding out why this code is there. Are there unintended side effects? If so, are they still there? Or was it introduced due to an explicit request back then? Was it just sloppy?

Removing the 5 lines is not all you have to do, by _far_.

Lots of fun, Dscho

Linus Torvalds· Jan 12, 2009, 16:13 UTC · re: Ping Yin · lore

Re: "git diff --stat" doesn't show added empty file

On Mon, 12 Jan 2009, Ping Yin wrote:
> $ git diff --stat HEAD^..
>  0 files changed, 0 insertions(+), 0 deletions(-)
In the kernel, we use "git diff --stat --summary" for exactly this reason.
Well, not exactly. 

The thing is, even if the file is _not_ empty, there's a huge difference between "added 100 lines to an already-existing file" and "created a new 100-line file". Which is exactly what "--summary" adds.

And it sometimes even makes sense to show the summary without the diffstat. If you're _only_ interested in create/delete/rename information, you can do "git show --summary <cmit>". It won't give you line counts, but it will give you information about any changes to filenames, eg in the kernel archive, you could see an example of this with

	git show -M --summary 95b482a8d31116f3f5c2a5089569393234d06385
where you have a combination of renames, creates and deletes.
So I think it's already better than what you ask for.
			Linus
Ping Yin· Jan 13, 2009, 07:42 UTC · re: Linus Torvalds · lore

Re: "git diff --stat" doesn't show added empty file

On Tue, Jan 13, 2009 at 12:13 AM, Linus Torvalds <torvalds@linux-foundation.org> wrote:

Show 28 quoted lines
>
>
> On Mon, 12 Jan 2009, Ping Yin wrote:
>> $ git diff --stat HEAD^..
>>  0 files changed, 0 insertions(+), 0 deletions(-)
>
> In the kernel, we use "git diff --stat --summary" for exactly this reason.
>
> Well, not exactly.
>
> The thing is, even if the file is _not_ empty, there's a huge difference
> between "added 100 lines to an already-existing file" and "created a new
> 100-line file". Which is exactly what "--summary" adds.
>
> And it sometimes even makes sense to show the summary without the
> diffstat. If you're _only_ interested in create/delete/rename information,
> you can do "git show --summary <cmit>". It won't give you line counts, but
> it will give you information about any changes to filenames, eg in the
> kernel archive, you could see an example of this with
>
>        git show -M --summary 95b482a8d31116f3f5c2a5089569393234d06385
>
> where you have a combination of renames, creates and deletes.
>
> So I think it's already better than what you ask for.
>
>                        Linus
>

Thanks. --summary works. I just want to get all changed files. I think "git diff --name-status A..B" should be better.

Ping Yin

← back to recent threads