threads / discuss / 18141

just curious: what influences a commit hash?

Subject: just curious: what influences a commit hash?

## tl;dr

4 messages between Mar 5, 2009 and Mar 5, 2009.

replies: 3people: 4as markdown or json

stoecher@gmx.at· Mar 5, 2009, 06:36 UTC · lore
Hi,
being new to git I did some experiments with commits looking at the hashes. What I observed:
* The same commit (same file, same committer, same message) into different empty repositories (git init) gives different hashes. So I assume that also the time of the commit influences the hash. Is this intended? For what reason?
* Having created two repositories exactly the same way (the history is the same except for the commit times and hashes) I applied the same patch (using git am) and again I got different hashes for these commits. So in some way also the repository/branch influences the hash of a commit!?
From reading the Git user's manual, chapter 10, object storage format, I was not expecting this. Can someone explain or give a link to a more detailed description?
thank you,
Wolfgang
-- 
Computer Bild Tarifsieger! GMX FreeDSL - Telefonanschluss + DSL
für nur 17,95 Euro/mtl.!* http://dsl.gmx.de/?ac=OM.AD.PD003K11308T4569a
Matt Enright· Mar 5, 2009, 07:25 UTC · re: stoecher@gmx.at · lore

Re: just curious: what influences a commit hash?

On Thu, 2009-03-05 at 07:36 +0100, stoecher@gmx.at wrote:
Show 5 quoted lines
> Hi,
> 
> being new to git I did some experiments with commits looking at the hashes. What I observed:
> * The same commit (same file, same committer, same message) into different empty repositories (git init) gives different hashes. So I assume that also the time of the commit influences the hash. Is this intended? For what reason?
> * Having created two repositories exactly the same way (the history is the same except for the commit times and hashes) I applied the same patch (using git am) and again I got different hashes for these commits. So in some way also the repository/branch influences the hash of a commit!?

This should be expected if the initial hashes in the history are different. The hash of a commit is based also on the hashes of all parent commits - in this way git 'protects' the repository history by guaranteeing that if two objects have the same hash, they will come from the same history. So the second issue is a consequence of the first, though I am not certain why the first occurs (if the file contents and size are the same, I would expect the hash for the blob/tree to be the same - maybe due to git's special handling of initial commits?)

Show 6 quoted lines
> From reading the Git user's manual, chapter 10, object storage format, I was not expecting this. Can someone explain or give a link to a more detailed description?
> 
> thank you,
> 
> Wolfgang
> 
Uwe Kleine-König· Mar 5, 2009, 09:02 UTC · re: Matt Enright · lore

Re: just curious: what influences a commit hash?

Hi,
On Thu, Mar 05, 2009 at 02:25:39AM -0500, Matt Enright wrote:
Show 5 quoted lines
> On Thu, 2009-03-05 at 07:36 +0100, stoecher@gmx.at wrote:
> > Hi,
> > 
> > being new to git I did some experiments with commits looking at the hashes. What I observed:
> > * The same commit (same file, same committer, same message) into different empty repositories (git init) gives different hashes. So I assume that also the time of the commit influences the hash. Is this intended? For what reason?
Yes, commit time and commit date influence the hash.

But the hashes for the corresponding trees should be the same. Check the output of git rev-parse $commit^{tree}.

If you want to reproduce the exact same commit, you need to set the env variables GIT_AUTHOR_DATE and GIT_COMMITTER_DATE. (Not sure, but GIT_AUTHOR_DATE might be handled by git am.)

Best regards Uwe

-- 
Pengutronix e.K.                              | Uwe Kleine-König            |
Industrial Linux Solutions                    | http://www.pengutronix.de/  |
Matthieu Moy· Mar 5, 2009, 10:38 UTC · re: stoecher@gmx.at · lore

Re: just curious: what influences a commit hash?

stoecher@gmx.at writes:
Show 7 quoted lines
> Hi,
>
> being new to git I did some experiments with commits looking at the hashes. What I observed:
> * The same commit (same file, same committer, same message) into
> different empty repositories (git init) gives different hashes. So I
> assume that also the time of the commit influences the hash. Is this
> intended? For what reason?

You should distinguish "commit objects" from "tree objects". You can see the "commit" object with, for example:

$ git cat-file -p HEAD tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 author Matthieu Moy <Matthieu.Moy@imag.fr> 1236249249 +0100 committer Matthieu Moy <Matthieu.Moy@imag.fr> 1236249249 +0100

foo
See: it contains a reference to the tree, possibly references to the
parents, and a timestamp. So, hashing it takes the timestamp into
account. A consequence of this is that you can not change the
timestamp for a commit without changing the "revision identifier"
(i.e. the hash of the commit object).

But the empty tree object is deterministically 4b825dc642cb6eb9a060e54bf8d69288fbee4904.

-- 
Matthieu

← back to recent threads