【问题标题】:Handle multiple pre-commit hooks处理多个预提交挂钩
【发布时间】:2014-12-24 19:18:05
【问题描述】:

我需要使用多个预提交挂钩脚本。不知道如何处理它们。是否应该将所有这些组合成一个大型预提交脚本?如果没有,如何处理多个预提交脚本?

【问题讨论】:

标签: git githooks


【解决方案1】:

是否应该将它们全部组合成一个大型预提交脚本?

是与否:你只能声明一个预提交脚本,所以这个脚本应该负责:

  • 调用实际的预提交脚本
  • 选择调用这些脚本的顺序。

所以:

  • 一个预提交脚本
  • 调用多个脚本,每个脚本都允许或不允许(及其退出状态)提交继续进行。

【讨论】:

【解决方案2】:

您可以使用只调用其他脚本(子挂钩)的委托脚本:

https://gist.github.com/carlos-jenkins/89da9dcf9e0d528ac978311938aade43

用法:

让你的构建系统在 Git hooks 目录中创建一个符号链接到这个脚本,并使用你想要参与的钩子的名称。

例如,pre-commit

然后这个钩子将按字母顺序执行所有可执行文件 (子挂钩)在以您参加的挂钩类型命名的文件夹下找到 后缀为.d

例如,pre-commit.d

它的样子:

.git/hooks/
 |_ pre-commit -> ../../tools/git/multihooks.py
 |_ pre-commit.d/
    |_ 01-cpp_coding_standard
    |_ 02-python_coding_standard
    |_ 03-something_else

这需要 Python3,但您可以使用其他技术提供类似的东西。

【讨论】:

  • 不知道为什么要包含 Python 3 的依赖项,但无论如何,我只是将 pre-commit 制作为一个 shell 脚本,然后从 pre-commit.d 目录中获取其他 shell 脚本。到目前为止似乎工作正常。
【解决方案3】:

您只能拥有一个预提交脚本,因此您必须使用该脚本来调用多个其他脚本。

使用以下内容创建一个可执行的/PATH/TO/GIT/.git/hooks/pre-commit 文件:

#!/bin/bash

cd "$(dirname "$0")/pre-commit.d"

for hook in *; do
    bash $hook
    RESULT=$?
    if [ $RESULT != 0 ]; then
        echo "pre-commit.d/$hook returned non-zero: $RESULT, abort commit"
        exit $RESULT
    fi
done

exit 0

然后将所有预提交脚本放入一个新的pre-commit.d/ 目录中。

/PATH/TO/GIT/.git/hooks/
└── pre-commit.d
    └── SCRIPT1
    └── SCRIPT2

确保脚本文件是可执行的。请记住,脚本中的工作目录默认为/PATH/TO/GIT/.git/hooks/pre-commit.d/

【讨论】:

    猜你喜欢
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多