Re: [ANNOUNCE] chronoversion: chronological archiving script with temporary commits
- From
Shawn O. Pearce <spearce@spearce.org>
- Date
- Mar 13, 2007, 15:45 UTC
- Message-ID
- <20070313154511.GA18890@spearce.org>
- In-Reply-To
- <e1dab3980703130526t4b573f18h793a065d54c9369@mail.gmail.com>
David Tweed <david.tweed@gmail.com> wrote:
Show 14 quoted lines
> A question for those who understand things: I stash the last written > _tree_'s hash in a tag and then when a new "commit's" directory tree > is written starts look to see if it's the same SHA value. If it is I > know I can avoid the commit. At the moment I'm using > > if os.path.exists(lastTreeFile) and > tree==open(lastTreeFile,"r").read()[:40]: > > to be safe just in case a user, eg, goes mad and manually deletes that > record. Clearly this is going to hit trouble if git ever decides to > put this tag into a packed refs file. > Is there any neat way of using builtin stuff like git-rev-parse to ask > if a ref has a given SHA1 value and return an easily parsed yes/no > answer?
The common idiom if you want to compare trees to see if you need to make a commit is:
oldc=`git rev-parse $tagname^{commit}`
oldt=`git rev-parse $oldc^{tree}`
newt`git write-tree`
if [ X$oldt = X$newt ]; then
: nothing to save
else
newc=`git commit-tree $newt -p $oldc`
git update-ref $tagname $newc $oldc
fiYes, a little ugly. But its safe; if another program were to alter the value of $tagname (e.g. "git branch -f", "git tag -f") while your script is running the update-ref in the else will fail, letting you know that $tagname changed in the process.
-- Shawn.