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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx> 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.

> 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.

> 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.

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.

>
> Thanks,
> john



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux