git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: git@vger.kernel.org
Subject: Re: Can't diff against the 00000000 revision
Date: Tue, 12 Jan 2016 10:32:39 -0500	[thread overview]
Message-ID: <20160112153239.GA8041@sigill.intra.peff.net> (raw)
In-Reply-To: <jwv4meiygrc.fsf-monnier+gmane.comp.version-control.git@gnu.org>

On Tue, Jan 12, 2016 at 10:17:24AM -0500, Stefan Monnier wrote:

> If I look at the initial commit on a branch, I see something like:
> 
>     % git show d59cfff346c3e210adc26501f8cebf8da5ab2e7d
>     commit d59cfff346c3e210adc26501f8cebf8da5ab2e7d
>     Author: Stefan Monnier <monnier@iro.umontreal.ca>
>     Date:   Wed Dec 2 20:46:51 2015 -0500
>     
>         Initial release
>     
>     diff --git a/bugit b/bugit
>     new file mode 100755
>     index 0000000..681bd38
>     --- /dev/null
>     +++ b/bugit
>     @@ -0,0 +1,512 @@
>     ...
> 
> which is great.  But I can't get the same result with
> 
>     git diff 0000000..681bd38
> 
> because it complains:
> 
>     % git diff 0000000..681bd38
>     fatal: ambiguous argument '0000000..681bd38': unknown revision or path not in the working tree.
>     Use '--' to separate paths from revisions, like this:
>     'git <command> [<revision>...] -- [<file>...]'
>     %

Right. There is no "000000" blob; it's just a syntactic placeholder.

If you want to diff against the empty blob, you can. Its name is:

  $ git hash-object -t blob /dev/null
  e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

> I bumped into this problem in a post-receive hook where I need to pay
> attention to all newly added files, and where this problem means that
> I can't use the same code for a newly added branch as for a push on
> a pre-existing branch.

Keep in mind that the "000000" in your example is showing the change in
the _blob_, not the change in revisions. Even if it were not 0's, you
could not run "git diff A..B" on it, because that syntax only works with
commits.

So the corner case you need to deal with is not about a newly added
branch; it is about a newly added file (or in the opposite direction, a
deleted file).

Or from your description, maybe you are also running into the all-zero
sha1 in the argument to the post-receive hook (where it is standing in
for a commit sha1 on a newly-pushed branch).

> I currently work around the problem by adding a dummy empty branch, but
> being able to use the revision 00000000 as a known reference to an empty
> tree would come in really handy, and since it's already used at various
> places in Git (post-receive hook and "git show" output, at least), it
> would seem like a natural extension.

The empty tree also has a name:

  $ git hash-object -t tree /dev/null
  4b825dc642cb6eb9a060e54bf8d69288fbee4904

and you can diff against that.

And hopefully that explains why "000000" does not necessarily make a
good placeholder for "the empty thing". There are multiple empty things,
and it is not clear what:

  git diff 0000000 1234abcd

means. Is 0000000 a tree? A blob?

-Peff

  reply	other threads:[~2016-01-12 15:32 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-12 15:17 Can't diff against the 00000000 revision Stefan Monnier
2016-01-12 15:32 ` Jeff King [this message]
2016-01-12 15:37   ` Jeff King
2016-01-12 16:26   ` Stefan Monnier
2016-01-12 18:20     ` Jeff King
2016-01-12 18:52     ` Junio C Hamano
2016-01-12 18:11   ` Andreas Schwab
2016-01-12 18:21     ` Jeff King

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160112153239.GA8041@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=monnier@iro.umontreal.ca \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).