# git diff-tree against the root commit

3 messages from 2010-10-29 to 2010-11-07. Participants: Joshua Jensen, Christoph Mallon, Linus Torvalds.
Thread: https://gitlist.dev/t/25586

## Joshua Jensen, 2010-10-29 06:13

Subject: git diff-tree against the root commit
Message-ID: <4CCA6623.8090705@workspacewhiz.com>
URL: https://gitlist.dev/e/4CCA6623.8090705%40workspacewhiz.com

```
I am mirroring a Git repository into another SCM.  I am using 'git 
diff-tree' to tell me what changes I need to make to the other SCM.

Today, I attempted to mirror a new submodule.  'git diff-tree' reported 
two SHAs... 0000000000000000000000000000000000000000 and the revision 
the submodule currently resides at.  I attempted to run a 'git 
diff-tree' within the submodule for the all zero SHA and the revision 
specified, but apparently, 0000000000000000000000000000000000000000 does 
not really represent the root commit and does not work.  I then 
discovered the --root option, but that doesn't seem to give me the 
complete file list either.

'git diff-tree' has been working great for everything else, but I really 
need a root commit diff-tree listing for proper automation.

What are my options?

Thanks!

Josh

```

## Christoph Mallon, 2010-11-07 10:58

Subject: Re: git diff-tree against the root commit
Message-ID: <4CD68662.4060709@gmx.de>
URL: https://gitlist.dev/e/4CD68662.4060709%40gmx.de
In-Reply-To: <4CCA6623.8090705@workspacewhiz.com>

```
On 29.10.2010 08:13, Joshua Jensen wrote:
> I am mirroring a Git repository into another SCM.  I am using 'git diff-tree' to tell me what changes I need to make to the other SCM.
> 
> Today, I attempted to mirror a new submodule.  'git diff-tree' reported two SHAs... 0000000000000000000000000000000000000000 and the revision the submodule currently resides at.  I attempted to run a 'git diff-tree' within the submodule for the all zero SHA and the revision specified, but apparently, 0000000000000000000000000000000000000000 does not really represent the root commit and does not work.  I then discovered the --root option, but that doesn't seem to give me the complete file list either.
> 
> 'git diff-tree' has been working great for everything else, but I really need a root commit diff-tree listing for proper automation.
> 
> What are my options?

Diff against the empty tree. This gives you the treeish of the empty tree:
	git mktree < /dev/null
The result is 4b825dc642cb6eb9a060e54bf8d69288fbee4904. This magic number is used in git in several places. git's behaviour with parentless commits is somewhat annoying and/or broken.

```

## Linus Torvalds, 2010-11-07 17:23

Subject: Re: git diff-tree against the root commit
Message-ID: <AANLkTimiyFhggBvK-AGqRnMXta65rEJvJSeQ+QGOnZWp@mail.gmail.com>
URL: https://gitlist.dev/e/AANLkTimiyFhggBvK-AGqRnMXta65rEJvJSeQ%2BQGOnZWp%40mail.gmail.com
In-Reply-To: <4CD68662.4060709@gmx.de>

```
On Sun, Nov 7, 2010 at 2:58 AM, Christoph Mallon
<christoph.mallon@gmx.de> wrote:
> On 29.10.2010 08:13, Joshua Jensen wrote:
>> I am mirroring a Git repository into another SCM.  I am using 'git diff-tree' to tell me what changes I need to make to the other SCM.
>>
>> Today, I attempted to mirror a new submodule.  'git diff-tree' reported two SHAs... 0000000000000000000000000000000000000000 and the revision the submodule currently resides at.  I attempted to run a 'git diff-tree' within the submodule for the all zero SHA and the revision specified, but apparently, 0000000000000000000000000000000000000000 does not really represent the root commit and does not work.  I then discovered the --root option, but that doesn't seem to give me the complete file list either.
>>
>> 'git diff-tree' has been working great for everything else, but I really need a root commit diff-tree listing for proper automation.
>>
>> What are my options?
>
> Diff against the empty tree.

That works, but it's a bit too technical.

The traditional way to do it is to just

   git diff-tree --root <commit>

where the magic "--root" option is just the flag to say "I want to see
the root as a diff too". The reason it isn't the default is
historical: since git started out for the kernel, and since the root
is an import from another tree, showing the root as a patch was
annoying.

You have to realize that back in the original coding days (when git
read-tree was introduced), it was meant for very basic scripting. What
is now "git log -p" used to be basically

  git-rev-list $(cat .git/HEAD) | git-diff-tree --stdin

and with the target being the kernel, the default of not showing that
first commit was a sane one (and going back even further,
git-diff-tree really only worked on trees, so you had to give explicit
beginning and end points).

Of course, by the time we actually had a "git log" command, I think
that default had already changed. But it still explains why there is a
separate option to show the root commit with a patch.

                                 Linus

```
