threads / discuss / 60178

Problem: `fatal: too-short tree object` when executing hash-object on tree

Subject: Problem: `fatal: too-short tree object` when executing hash-object on tree

## tl;dr

3 messages between Aug 31, 2023 and Aug 31, 2023.

replies: 2people: 3as markdown or json

Gareth Hayes· Aug 31, 2023, 10:58 UTC · lore
Problem: I'm trying to reproduce the identifier of a tree object using `git cat-file -p <tree object identifier> | git hash-object -t tree --stdin`

This results in an error: `fatal: too-short tree object`

To replicate: `git cat-file -p HEAD` `git cat-file -p <tree object identifier from output of above> | git hash-object -t tree --stdin`

This works for other object types but not trees. What am I doing wrong?
Johannes Sixt· Aug 31, 2023, 17:10 UTC · re: Gareth Hayes · lore

Re: Problem: `fatal: too-short tree object` when executing hash-object on tree

Am 31.08.23 um 12:58 schrieb Gareth Hayes:
> Problem: I'm trying to reproduce the identifier of a tree object using `git cat-file -p <tree object identifier> | git hash-object -t tree --stdin`
XY-problem alert!?
Show 8 quoted lines
> This results in an error:
> `fatal: too-short tree object`
> 
> To replicate: 
> `git cat-file -p HEAD`
> `git cat-file -p <tree object identifier from output of above> | git hash-object -t tree --stdin`
> 
> This works for other object types but not trees. What am I doing wrong?

Recall that the -p in cat-file means "pretty" (-print). The data that makes up a tree object is far from pretty, hence, you can't feed it into git hash-object directly.

You can either turn the pretty-printed input into a tree object
   git cat-file -p $treeoid | git mktree
or hash the raw data
   git cat-file tree $treeoid | git hash-object -t tree --stdin
-- Hannes
Junio C Hamano· Aug 31, 2023, 17:25 UTC · re: Gareth Hayes · lore

Re: Problem: `fatal: too-short tree object` when executing hash-object on tree

"Gareth Hayes" <gareth.hayes@bitcoin.org.hk> writes:
Show 10 quoted lines
> Problem: I'm trying to reproduce the identifier of a tree object using `git cat-file -p <tree object identifier> | git hash-object -t tree --stdin`
>
> This results in an error:
> `fatal: too-short tree object`
>
> To replicate: 
> `git cat-file -p HEAD`
> `git cat-file -p <tree object identifier from output of above> | git hash-object -t tree --stdin`
>
> This works for other object types but not trees. What am I doing wrong?

It would work *ONLY* for blob, and not commit or tag object types, no?

The "-p" option is to present the object in a human-friendly format, as opposed to giving the raw stream of bytes that is suitable for machine consumption and required by hash-object. It so happens that for "blob", the raw stream of bytes is just as human-friendly as the tool can make, without having a deep knowledge of the content type (e.g. it may be possible to make "cat-file -p <blob>" to somehow apply an appropriate textconv filter if the path to <blob> is known as a future enhancement, but such a code does not exist yet, and when it happens, even "cat-file -p <blob> | hash-object --stdin" would not round-trip).

So, that is what you are doing wrong, I think.

← back to recent threads