git-clone and post-checkout hook

随声附和 提交于 2019-11-26 08:28:51

问题


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://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


回答1:


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.




回答2:


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


来源:https://stackoverflow.com/questions/2141492/git-clone-and-post-checkout-hook

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!