除了 core.hooksPath 全局挂钩之外,如何 运行 本地 Git 项目挂钩?

How to run local Git project hooks in addition to core.hooksPath global hooks?

目前我正在使用

git config --global core.hooksPath ~/.git/hooks

为我的所有 git 项目配置全局挂钩。但是,如果这些项目包含挂钩,则它们不是 运行。

我想要 运行 全局挂钩和项目挂钩。谢谢!

我认为唯一的方法是让全局挂钩检查是否存在相应的本地挂钩并 运行 它。

这不是一个完整的解决方案,因为一些挂钩(例如 pre-push)除命令行参数外还接受标准输入。如果其中一个钩子消耗了标准输入,另一个就没有机会了。

为了从全局钩子中执行本地钩子,可以使用以下脚本片段:

if [ -e ./.git/hooks/commit-msg ]; then
    ./.git/hooks/commit-msg "$@"
fi

全局挂钩在提交的 repo 目录中运行,因此可以检查其 .git 目录中是否存在本地挂钩。

请注意,如果您使用的不是提交消息挂钩,则必须采用挂钩名称。

每个挂钩都需要这样做,但我确认它适用于 prepare-commit-msg

# run the global prepare-commit-msg if it is present
if [ -e `git config --global core.hookspath`/prepare-commit-msg ]; then
    `git config --global core.hookspath`/prepare-commit-msg "$@"
fi
# otherwise do nothing

我在 .husky/prepare-commit-msg 的文件中将其与 Husky 7 一起使用。也应该作为本地挂钩工作。