Geoffrey Bachelet
Geoffrey Bachelet

Reputation: 4317

git-clone and post-checkout hook

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:

It seems impossible that a post-checkout hook ever gets executed after a git clone. Still, the githooks man page at http://git-scm.com/docs/githooks 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

Upvotes: 44

Views: 39276

Answers (2)

Cascabel
Cascabel

Reputation: 496902

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.

Upvotes: 20

Greg Bacon
Greg Bacon

Reputation: 139471

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

Upvotes: 16

Related Questions