git config --global init.templatedir" namedfolder"将挂钩设置在" namedfolder"对于所有git实例。
如果存在预先存在的钩子,则会被覆盖。
是否有可以执行的警告,或智能合并钩子的方法?例如,如果一个团队使用的预提交挂钩存在警告过时并且钩子被更新,那么预提交现在执行一些其他功能,可以与过期检查互补(或不),运行上述命令删除陈旧检查钩子。假设我们想要附加到钩子上。除非在上面执行--global之前单独执行,否则看不到这样做的方法/标志。
答案 0 :(得分:0)
除了我的评论,简短的回答是" no"。我认为Git中的一个小缺陷之一就是每个钩子只是一件事:
.git/hooks/pre-commit
.git/hooks/update
等等。但是,如果您或您的团队或团队已经编写了几个很酷/有用/任何预先提交,prepare-commit-msg等等,并且您想要运行所有它们呢?
Git不会赢,也无法做到。实际上,没有可以工作的全自动解决方案,因为挂钩可能会改变状态,这意味着运行Hook A后跟Hook B将产生与运行Hook B后跟Hook不同的结果甲
可以做的是将您的钩子编写为有用但独立的脚本,然后从.git/hooks/name
按所需顺序调用每个所需的钩子 。例如,假设你有一个"检查剩余的调试垃圾" pre-commit hook,以及一个单独的" space vs tabs"预提交钩子。 (这个例子不依赖于顺序,因为我现在只是动态地编写它并且不能想出更好的例子。)然后你的.git/hooks/pre-commit
可能会读到:
#! /bin/sh
# run pre-commit checks
/home/shared/teamX/scripts/git-check-leftover-debug-junk || exit $?
/home/shared/teamY/scripts/git-check-spaces-vs-tabs || exit $?
(最终的|| exit $?
不是必需的,它就在那里,所以我们可以在以后添加更多的钩子。)
但这里存在次要问题。对于一些钩子,我们可以添加"$@"
来传递参数,一切都很好。但是,对于pre-receive
和post-receive
和pre-push
挂钩,重要数据会显示在标准输入上。 此输入来自管道,因此当一个钩子读取它时,数据已被消耗,并且不再可用于剩余的钩子。解决方法是将输入复制到文件,然后重定向每个挂钩以从该文件读取。 (这也是每次从偏移量0重新启动读取所必需的,所以这并不像Git中的bug那样大:只是提供输入作为临时文件,而不是管道,不足以,你每次都必须重新寻求零。)
在之前的$ job中,我曾写过一个"主钩#34;将运行"子钩子",使用它所调用的名称来查找所有子钩子。子钩子来自一组并行的目录,其名称模式与钩子相同。主挂钩会将stdin复制到临时文件并传递参数,这样每个挂钩都可以表现为它是唯一的挂钩。这允许我们随心所欲地添加和删除钩子,通过文件名控制顺序:multihook/pre-receive/10.foocheck
将在multihook/pre-receive/20.barcheck
之前运行,即使foo
在bar
之前排序,因为{{1}在10
之前排序。事实证明,毕竟我们并不需要那么多的幻想:我们从来没有超过三次预接收钩子并且没有频繁更改它们,至少在我在那里的时候。
(代码非常简单。作为shell脚本,它大概有六行。)