git-clone和post-checkout hook

时间:2010-01-26 18:01:53

标签: git hook git-clone

根据手册,post-checkout挂钩在git checkout之后(正如预期的那样)运行,但也在git clone之后运行(除非您通过--no-checkout)。< / p>

很好,现在,考虑以下因素:

  • 您在git clone
  • 之前没有本地存储库
  • 挂钩未在遥控器之间同步
  • 存储在与--template一起使用的自定义模板目录中的
  • 挂钩被复制为不可执行,因此在git clone 之后执行(实际上是不是Jefromi在他的回答中所说的那样,但钩子仍未执行)

post-checkout之后,似乎不可能执行git clone挂钩。尽管如此,http://git-scm.com/docs/githooks上的githooks手册页明确指出了一种避免执行的方法,并且在执行时也传递了参数,这表明可以在{{{}}之后执行自定义钩子。 {1}}。

那么,怎么可能呢?我显然在这里遗漏了一些东西。

结果

2 个答案:

答案 0 :(得分:15)

我想您可以进行自定义安装 - 重命名.../share/git-core/templates/hooks中的挂钩以删除.sample后缀。

您还可以将一个充满符号链接的模板目录创建到存储库中的hooks目录(例如post-checkout -> ../../hooks/post-checkout)。然后,如果克隆的repo包含该特定的钩子,它就会被执行。

你是对的,但在大多数情况下都不会发生。

编辑:我刚刚对其进行了测试,--template选项似乎确实保留了权限,因此这是一种更加直接的方式来实现它。你看到什么表明它剥离了那一点?

对版本的最终决定权:您正在网上查看有关比您正在使用的更新版本的git的文档。这个功能是在dfa7a6c中添加的(克隆:签出时运行post-checkout hook); git describe说直到v1.6.2-rc2才包括它。

答案 1 :(得分:10)

来自githooks documentation

  

运行 git-init 时,会将少量示例挂钩复制到新存储库的hooks目录中,但默认情况下它们都被禁用。要启用挂钩,请通过删除其.sample后缀来重命名。

此初始化是在创建克隆时发生的,请注意builtin-clone.c中对init_db的调用。

例如:

$ 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