处理多个预提交挂钩

时间:2014-10-29 06:57:24

标签: git githooks

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

3 个答案:

答案 0 :(得分:24)

  

是否应将所有这些内容合并为一个大型的预提交脚本?

是和否:您只能声明一个预提交脚本,因此该脚本应该负责:

  • 调用实际的预提交脚本
  • 选择了要调用这些脚本的订单。

所以:

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

答案 1 :(得分:16)

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

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,但你可以使用其他技术来提供类似的东西。

答案 2 :(得分:7)

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

使用以下内容创建可执行文件/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/