【问题标题】:git serverside hook - pre-receive or update for checking code formatting for Java - How to use it?git serverside hook - 用于检查 Java 代码格式的预接收或更新 - 如何使用它?
【发布时间】:2026-01-20 12:50:01
【问题描述】:

我正在尝试添加一个服务器端检查,该检查将从 git push 触发 - 检查提交的代码/差异是否格式正确。 客户端存在代码格式化程序(Eclipse Code Formatter),这是最后的检查。 到目前为止,我遇到的 pre-receive hook 和 update hook 的例子很少。

#!/usr/bin/env bash
# Git update hook servers side, also doing and checking formatting of code
# check each branch being pushed
# Exit status 0 = all OK
# Exit status 1 = Problem, commit will be rejected

echo "update hook initiated"
# get different values (They are default - from update hook)
ref_name=$1
old_rev=$2
new_rev=$3

# only check branches, not tags or bare commits
#if [ -z $(echo $ref_name | grep "refs/heads/") ]; then
#  exit 0
#fi

# don't check empty branches
if [ "$(expr "${new_rev}" : '0*$')" -ne 0 ]; then
  exit 0
fi

仅执行失败:

remote: : Permission denied
remote: error: hook declined to update refs/heads/master

任何指针都会很棒!

【问题讨论】:

  • 钩子是否驻留在.git/hooks/update 的服务器端?脚本可执行吗?
  • 是的,它位于您提到的位置。是的,它是可执行的。

标签: git githooks


【解决方案1】:

行:

remote: : Permission denied

很有启发性。请注意此处的冒号-空格-冒号模式。您的 Git 添加了 remote: ,包括第一个冒号和空格,因此来自远程的消息(来自尝试运行更新挂钩的服务器)实际上是:

: Permission denied

也就是说,钩子似乎正在运行一个没有字符的命令。通常你会在这里得到command not found;目前尚不清楚您为什么收到Permission denied。无论如何,鉴于您展示的钩子,这似乎是不可能的。也许服务器正在运行不同的东西。但是,如果它正在运行 bash 脚本,请尝试添加 -x 选项:

#! /usr/bin/env bash -x

这将让您在执行时查看每一行,并帮助找到带有空命令的行。以下是运行此类脚本的示例:

$ cat > /tmp/foo.bash
#! /usr/bin/env bash -x
""
$ chmod +x /tmp/foo.bash
$ /tmp/foo.bash
+ ''
/tmp/foo.bash: line 2: : command not found
$

+ '' 行显示了在第 2 行执行空命令的尝试,后面是详细的错误消息。

【讨论】:

    最近更新 更多