Git钩子:是否有克隆钩子?

42
我们希望将提交的一些元信息存储在外部数据库中。在克隆或检出时,应该引用此数据库,并将元信息复制到克隆的仓库中的一个文件中。需要使用数据库而不仅仅是使用文件是为了索引和搜索等方面的考虑。
我认为如果有克隆钩子,我们可以触发这个操作。但我在.git/hooks示例中找不到克隆钩子。它是否存在?客户端是否只能使用post-checkout钩子来实现?
5个回答

32

可以使用clone --template选项来实现此操作。

将客户端钩子存储的位置指定为--template开关的值。 钩子将被复制到克隆中,post-checkout钩子将立即触发!


9
但是模板目录不能在您克隆的存储库内部 - 在克隆之前,它必须已经存在于文件系统中。 - chrishiestand
1
https://dev59.com/xnI95IYBdhLWcg3wzhZ9#2141577 对我帮助很大,更加明确,并且解决了你提到的问题 @chrishiestand - mswieboda

13
当你克隆一个远程仓库时,由于钩子(hooks)是局部的工作副本(working copy)的一部分,所以你无法运行任何客户端钩子,因为你正在从头开始创建一个新的副本。当你从远程仓库拉取新变更时,如果存在本地 post-merge 钩子,Git 会运行它。
pull 操作中没有任何东西在服务器上运行。而push 操作将触发服务器上的 updatepost-update 钩子运行。
请参阅Git Book获取更多信息。

10

不,没有克隆钩子。


5

自从git版本1.6.3以来,post-checkout钩子在git-clone(没有使用--no-checkout参数运行时)会被执行。

除非使用--no-checkout(-n)选项,否则也会在git-clone[1]之后运行。 钩子的第一个参数是null-ref,第二个参数是新HEAD的引用,并且标志始终为1。

https://git-scm.com/docs/githooks#_post_checkout


这里没有说明如何将钩子代码添加到.git/hooks或替代查出的方法。 - TamusJRoyce

3
我晚了,但是有一个解决方法:
  1. 捕获 git clone 的执行并使用 trap set_var_on_git_clone DEBUG 设置变量,其中 set_var_on_git_clone 是用户定义的函数。(例如:https://gist.github.com/KeyAmam/a6afcabc3a724fc4a541aca7629c3ff6)

  2. post-checkout 脚本中检查变量并在需要的情况下执行一些操作。 在脚本结束时清除变量。(例如:https://gist.github.com/KeyAmam/6a0e8805c0b6a662adb6bcf8118a089a)

这只适用于 Bash,但您可以在其他 shell 中进行类似的操作。

很好 - 我可以将这个加入到我们的机器设置 Ansible 脚本中,而且很容易让它检测和获取 .../.git_clone_hook,这样钩子就像 .gitignore 一样在源代码控制下了。 - Tim Baverstock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接