我想为我的git存储库创建自定义prepare-commit-msg
挂钩。
首先,我了解了参数,因此我创建了诸如test之类的东西来查看这些参数的值。
#!/usr/bin/env bash
readonly file_with_message=$1
readonly source_of_message=$2
readonly commit_sha=$3
echo "File: \"${file_with_message}\""
echo ""
echo "Source: \"${source_of_message}\""
echo ""
echo "SHA: \"${commit_sha}\""
echo ""
我得到了以下日志:
File: ""
Source: ""
SHA: ""
commit-msg File: ""
[1111-pre-commit-msg-test 4f347d4] add .idea
5 files changed, 189 insertions(+)
create mode 100644 .idea/fast.iml
create mode 100644 .idea/misc.xml
create mode 100644 .idea/modules.xml
create mode 100644 .idea/vcs.xml
create mode 100644 .idea/workspace.xml
基本上,我可以看到我的钩子在提交期间正在执行,但是没有参数。至少应该有第一个。
$ git --version
git version 2.17.2 (Apple Git-113)
有人知道,为什么会这样? 谢谢:)
PS:我可以看到commit-msg
挂钩的行为相同。 (还有一个日志消息)
答案 0 :(得分:2)
原因是,我们有自定义的钩子执行系统:
每个<hook>
都试图执行<hook>.local
和<hook>.enectiva
(enectiva是我们的产品,这就是扩展名的原因)
所以在这种情况下:
包含文件prepare-commit-msg
的钩子:
#!/usr/bin/env bash
hook_name="prepare-commit-msg"
git_path=".git/hooks"
files="./${git_path}/${hook_name}.local ./${git_path}/${hook_name}.enectiva"
for f in ${files}; do
if [[ -f ${f} ]]; then
${f} || exit 1
fi
done
此文件也具有正确的参数,但没有传递它们。
我以前的日志代码来自prepare-commit-msg.enectiva
,因此有点误导。并且prepare-commit-msg.enectiva
没有收到任何参数。
所以解决方法是使用${f} $1 $2 $3
这是更改钩子后的结果:
File: ".git/COMMIT_EDITMSG"
Source: "message"
SHA: ""
编辑:
${f} "${@}" || exit 1