git-clone和post-checkout hook

Geo*_*let 28 git hook git-clone

根据手册,post-checkout钩子在a git checkout(正如预期)之后运行,但也在a之后运行git clone(除非你通过--no-checkout).

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

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

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

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

结果

Cas*_*bel 15

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

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

不过,你说得对,在大多数情况下都不会发生.

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

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


Gre*_*con 12

githooks文档:

混帐初始化运行,例如挂钩极少数被复制到hooks新的存储库的目录中,但默认情况下它们都被禁止.要启用挂钩,请通过删除其.sample后缀来重命名它.

这个初始化发生作为创建克隆,注意调用的一部分init_dbbuiltin-clone.c.

例如:

$ 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

  • 此处的文档更多地讨论在您自己的存储库中启用它,并且 OP 显然意识到了这一点。当然,您可以将安装目录中的模板中的后缀去掉(这正是我已经发布的)。 (2认同)