views:

636

answers:

2

According to the manual, the post-checkout hook is run after a git checkout (just as expected) but also after a git clone (unless you pass --no-checkout).

Very well, now, considering the following:

  • you don't have a local repository before a git clone
  • hooks are not synced between remotes
  • hooks stored in a custom template directory used with --template are copied non-executable and therefore not executed after git clone (that is actually not true as stated by Jefromi in his answer, but the hook is still not executed)

It seems impossible that a post-checkout hook ever gets executed after a git clone. Still, the githooks man page at http://www.kernel.org/pub/software/scm/git/docs/githooks.html explicitely states a way to avoid it being executed, and also parameters passed in case it is executed, which would indicate it is possible to execute a custom hook after a git-clone.

So, how is it possible? I am obviously missing something here.

Turns out

+2  A: 

I suppose you could make a custom installation - rename the hooks in .../share/git-core/templates/hooks to remove the .sample suffix.

You could also make a template directory full of symlinks to a hooks directory inside the repository, (e.g. post-checkout -> ../../hooks/post-checkout). Then if the cloned repo contained that particular hook, it'd get executed.

You're right, though, in most cases it will not happen.

Edit: I just tested it, and the --template option does appear to preserve permissions, so that's a much more straight-forward way to make it happen. What'd you see to indicate that it stripped that bit?

The final say on versions: You're looking at documentation online for a newer version of git than you're using. This feature was added in dfa7a6c (clone: run post-checkout hook when checking out); git describe says this wasn't included until v1.6.2-rc2.

Jefromi
Right, I just tested, and it turns out they are actually copied with the executable bit (not sure why I though it was stripped off, must have read that somewhere on the internet).The hook is still not executed though, it's weird because if I do a `git checkout` right after the `git clone`, it is executed properly.What version of git do you have ? I use 1.6.0.4 here.I've posted the exact procedure used in a gist: http://gist.github.com/287084
Geoffrey Bachelet
Also, I just tested putting the hook in `/usr/share/git-core/template` and it produces the exact same result
Geoffrey Bachelet
I did a quick test with `clone --template` - an executable post-checkout hook is definitely executed for me. I use the current git.git version (right now, git 1.7.0.rc0.8.ge3f67d). I'm not the only one on my current system, so trying it with older versions would have to wait until later.
Jefromi
Ok, it seems obvious now that I should upgrade my installation of Git! I'm going to try that tomorrow. Thank you all for your answers and time :-)
Geoffrey Bachelet
+1  A: 

From the githooks documentation:

When git-init is run, a handful of example hooks are copied into the hooks directory of the new repository, but by default they are all disabled. To enable a hook, rename it by removing its .sample suffix.

This initialization takes place as part of creating a clone—note the call to init_db in builtin-clone.c.

For example:

$ cat /tmp/my-git-template/hooks/post-checkout 
#! /bin/bash
echo "Hello from $0"

$ git clone --template=/tmp/my-git-template file:///tmp/repo.git my-clone
Initialized empty Git repository in /tmp/my-clone/.git/
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
Hello from .git/hooks/post-checkout
Greg Bacon
The documentation here is more talking about enabling it within your own repository, and the OP is obviously aware of this. Of course, you can remove the suffix from the templates in the installation directory (which is exactly what I already posted).
Jefromi
So it works properly with yours too - either the OP's made a silly mistake in testing, or a bug has been fixed since 1.6.0 - since you link to the source, I suspect you're using a pretty new version too?
Jefromi
I'm running 1.6.5.5. I have access to another box with 1.5.5.6 which copies the hook and retains the execute bits but does not seem to execute it.
Greg Bacon