tags:

views:

293

answers:

1

One of git's unavoidable quirks is its inability to store and retrieve metadata about a file. For example, on the mac, labels are stored with "extended attributes" (accessible with xattr), and any checkout/reset/merge/pull command will erase those attributes if the file is affected by the checkout.

I've looked around to see if someone has written metadata-saving scripts already, but I came up dry.

So what I'd like to do is use Git's hook system to:

  1. Read extended attributes when files are committed,
  2. Write the attributes to a file stored in the repository that also gets committed,
  3. Apply the extended attributes to files that are modified in a merge/checkout/reset.

Which of the hooks should I use? Are post-receive and pre-commit all that I need? Can pre-commit also add a file to the commit (i.e., after writing the new attributes)?

+2  A: 

The gibak tool uses pre-commit and post-checkout to let its ometastore tool save/restore metadata (optionally including xattrs).

You do not want post-receive. It is run on the remote end of pushes. It runs for bare repositories, so it has no business trying to update any files from the contents of a pushed commit. Do it in post-checkout where you know you will have a working tree available.

Chris Johnsen
post-merge is also one that should be used. See githooks(5) http://ftp.kernel.org/pub/software/scm/git/docs/githooks.html
Seth Johnson
@Seth Johnson: good catch. You could have `post-merge` do the same kind of work as `post-checkout` to rebuild any metadata that was lost when the merge rewrote files. Merging metadata might be tricky though, depending on how your chosen tools stores it and makes it available for viewing/diffing.
Chris Johnsen