git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [Question] .git folder file updates for changing head commit

From
JGJohn Garry <john.garry@huawei.com>
Date
Mar 24, 2022, 12:59 UTC
Message-ID
<5ceff005-bbe4-37f5-c453-17008c2167bc@huawei.com>
In-Reply-To
<kl6la6dgtmv8.fsf@chooglen-macbookpro.roam.corp.google.com>
On 23/03/2022 20:50, Glen Choo wrote:
Show 26 quoted lines
> Hi John, I'm not a big expert on Make (or even Git :p) but think I can
> answer some of your questions.
> 
> John Garry <john.garry@huawei.com> writes:
> 
>> Hi guys,
>>
>> I have a question about which files in the .git folder are updated as we
>> change the head commit. I could check the codebase myself but prob will
>> make a mistake and maybe some expert would be so kind as to just kindly
>> tell me.
>>
>> For building the linux perf tool we use the git head commit id as part
>> of the tool version sting. To save time in re-building, the Makefile
>> rule has a dependency on .git/HEAD for rebuilding. An alternative
>> approach would be to compare git log output to check current versus
>> previous build head commit, but that is seen as inefficient time-wise.
> 
> You're on the right track because if .git/HEAD doesn't change, the HEAD
> is still pointing to either the same commit (if in detached HEAD) or
> branch (if not in detached HEAD).
> 
> The problem is that when HEAD points to a branch, the branch's 'head
> commit' can change, implicitly changing the commit that .git/HEAD
> actually points to.
> 
ok
Show 17 quoted lines
>> The problem is that actions like git cherry-pick and git reset --hard
>> HEAD^ may not update .git/HEAD (so don't trigger a rebuild).
> 
> That's what's happening here. If your HEAD is pointing to
> "refs/heads/main", "cherry-pick" and "reset --hard" will change where
> "refs/heads/main" points, but HEAD still points to "refs/heads/main".
> 
> Branches are often located in "loose form" under .git/refs/heads/*,
> *but* refs can also be stored in a "packed form" under .git/packed-refs
> (https://git-scm.com/docs/git-pack-refs). There is also a relatively
> new ref storage format called reftable that I'm not familiar with, but
> presumably stores its refs in other locations too.
> 
> All of this is to say that depending on specific files under .git/
> exposes you to a lot of Git internals that really aren't meant for
> external consumption. I suggest finding a different approach than
> watching Git-internal files for changes.
Thanks for the detailed explanation.

I agree with your suggestion to find a new method (which may be reverting to the old method to just run proper git commands).

Show 8 quoted lines
> 
>> Is there some more suitable file(s) which we could use as a dependency?
>>   From my limited experimentation, .git/index seems to always update when
>> the changing head commit.
> 
> I think users typically expect the index (and therefore .git/index) to
> change when the head commit changes, but this isn't always true e.g.
> "reset --soft" will move the branch without changing the index.
ok, good to know. I was going to try that...
Show 6 quoted lines
> 
> P.S. Even if you knew the value of .git/index or .git/HEAD, that
> wouldn't tell you whether or not the files in your working directory
> have changed, so I'm not sure if you want to use either as Makefile
> dependency.
> 

ok, thanks again for all this info, John

Previous: Glen ChooNext: Andreas Schwab
Message 7 of 9 in “[Question] .git folder file updates for changing head commit”
  1. John GarryMar 23, 2022
  2. Taylor BlauMar 23, 2022
  3. John GarryMar 24, 2022
  4. Ævar Arnfjörð BjarmasonMar 27, 2022
  5. John GarryMar 30, 2022
  6. Glen ChooMar 23, 2022
  7. John GarryMar 24, 2022
  8. Andreas SchwabMar 23, 2022
  9. John GarryMar 24, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.