threads / discuss / 5054

git-diff between /dev/null and blob

Subject: git-diff between /dev/null and blob

## tl;dr

5 messages between Jul 31, 2006 and Aug 7, 2006.

replies: 4people: 2as markdown or json

Jakub Narebski· Jul 31, 2006, 01:07 UTC · lore
Currently, due to artifact of git-diff argument parsing you can get diff 
of two arbitrary blobs given by their sha1 id, e.g.
  git diff ab8050ceb4e43522e858768cc2c02fcb91839370 fd05278808d458602587bb024a48726018d30926
but you cannot use git-diff to create diff between two files, or a file
and blob. 

In particular, I couldn't make "creation" patch, i.e. patch between /dev/null and specified blob. If it would be possible, we could lose gitweb.cgi dependency on diff.

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git
Junio C Hamano· Jul 31, 2006, 06:50 UTC · re: Jakub Narebski · lore

Re: git-diff between /dev/null and blob

Jakub Narebski <jnareb@gmail.com> writes:
> Currently, due to artifact of git-diff argument parsing you can get diff 
> of two arbitrary blobs given by their sha1 id, e.g.
>   git diff ab8050ceb4e43522e858768cc2c02fcb91839370 fd05278808d458602587bb024a48726018d30926

Just FYI, it is pretty much by design not artifact to allow something like this:

	git diff master:Makefile next:Makefile
Jakub Narebski· Aug 6, 2006, 21:02 UTC · re: Junio C Hamano · lore

Re: git-diff between /dev/null and blob

Junio C Hamano wrote:
Show 10 quoted lines
> Jakub Narebski <jnareb@gmail.com> writes:
> 
>> Currently, due to artifact of git-diff argument parsing you can get diff 
>> of two arbitrary blobs given by their sha1 id, e.g.
>>   git diff ab8050ceb4e43522e858768cc2c02fcb91839370 fd05278808d458602587bb024a48726018d30926
> 
> Just FYI, it is pretty much by design not artifact to allow
> something like this:
> 
>       git diff master:Makefile next:Makefile
Which we could get using
        git diff master next -- Makefile
Currently ('next' branch) git-diff manpage talks only about comparing trees.
* When  no  <ent>  is given, the working tree and the index file is compared,
  using git-diff-files.
* When one <ent> is given, the working tree and the named tree  is  compared,
  using git-diff-index. The option --cached can be given to compare the index
  file and the named tree.
* When  two  <ent>s  are  given,  these  two   trees   are   compared   using
  git-diff-tree.

And the only way to compare blobs is by giving directly or indirectly (like above) sha1 of the blobs, i.e. only the third case is supported.

git-diff doesn't understand :<stage>:<filename> and :<filename> for accessing index version of blob (git-cat-file for example understands it). Note: <filename> in <revision>:<filename> and <stage>:<filename> must be wrt GIT_DIR.

It is also no way to specify working tree version of file (blob). We could use ::<filename> for that, I think...

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git
Junio C Hamano· Aug 6, 2006, 21:36 UTC · re: Jakub Narebski · lore

Re: git-diff between /dev/null and blob

Jakub Narebski <jnareb@gmail.com> writes:
Show 16 quoted lines
> Junio C Hamano wrote:
>
>> Jakub Narebski <jnareb@gmail.com> writes:
>> 
>>> Currently, due to artifact of git-diff argument parsing you can get diff 
>>> of two arbitrary blobs given by their sha1 id, e.g.
>>>   git diff ab8050ceb4e43522e858768cc2c02fcb91839370 fd05278808d458602587bb024a48726018d30926
>> 
>> Just FYI, it is pretty much by design not artifact to allow
>> something like this:
>> 
>>       git diff master:Makefile next:Makefile
>
> Which we could get using
>
>         git diff master next -- Makefile

Eh, that comment completely misses the point, because the example did not show its true strength. Arbitrary two blob sha1 lets you do something like this:

	git diff v0.99:merge-cache.c master:merge-index.c
	git diff v0.99:pull.h fetch.h
        echo extra >>Makefile && git diff :0:Makefile HEAD^^:Makefile
        H=`(cat Makefile; echo extra) | git hash-object -w --stdin`
	echo "100644 $H 2	foobar" | git update-index --add --index-info
	git diff :2:foobar :Makefile
> git-diff doesn't understand :<stage>:<filename> and :<filename> for
> accessing index version of blob (git-cat-file for example understands
> it).

You probably got this impression from a botched experiment or something, but this statement is wrong as demonstrated above.

Jakub Narebski· Aug 7, 2006, 12:52 UTC · re: Junio C Hamano · lore

Re: git-diff between /dev/null and blob

Junio C Hamano wrote:
> Jakub Narebski <jnareb@gmail.com> writes: 
Show 14 quoted lines
>        git diff v0.99:pull.h fetch.h
>
>         echo extra >>Makefile && git diff :0:Makefile HEAD^^:Makefile
> 
>         H=`(cat Makefile; echo extra) | git hash-object -w --stdin`
>       echo "100644 $H 2       foobar" | git update-index --add --index-info
>       git diff :2:foobar :Makefile
> 
>> git-diff doesn't understand :<stage>:<filename> and :<filename> for
>> accessing index version of blob (git-cat-file for example understands
>> it).
> 
> You probably got this impression from a botched experiment or
> something, but this statement is wrong as demonstrated above.
Right, sorry.

And you can write ./<filename> to distinguish it from revision name, so proposed ::<filename> extension is not needed.

-- 
Jakub Narebski
Warsaw, Poland
ShadeHawk on #git

← back to recent threads