Bonobo Git Server 6.3钩子异常及分支权限控制求助
解决Bonobo Git Server钩子问题:pre-receive拒推、pre-push不生效
先给你理清几个关键问题,再给你钩子脚本的正确写法和配置排查方向:
一、为什么空的pre-receive文件直接提示“pre receive hook declined”?
在Windows环境下的Bonobo Git Server中,无扩展名的钩子脚本会被Git默认用cmd解释器执行,但空脚本的退出码不是0(Git钩子要求返回0才允许操作,非0则拒绝),所以直接触发拒推。
解决这个问题的第一步是给pre-receive脚本加上正确的扩展名(比如.cmd或者.ps1),然后编写逻辑确保通过检查时返回exit /b 0。
示例:限制特定用户推送特定分支的pre-receive.cmd脚本
@echo off :: 读取Git传入的三个参数:旧提交ID、新提交ID、目标分支 set OLD_REV=%1 set NEW_REV=%2 set BRANCH=%3 :: 配置要限制的分支(注意格式是refs/heads/分支名,比如main就是refs/heads/main) set RESTRICTED_BRANCH=refs/heads/main :: 配置允许推送的用户名(要和Bonobo中用户的登录名一致) set ALLOWED_USER=admin :: 先确认当前推送用户的环境变量——Bonobo会把登录用户放在REMOTE_USER或USERNAME变量里 :: 可以先加这行输出环境变量到日志,确认哪个变量对应登录用户 :: set > C:\temp\bonobo_hook_env.log set CURRENT_USER=%REMOTE_USER% :: 判断是否是要限制的分支 if /i "%BRANCH%"=="%RESTRICTED_BRANCH%" ( :: 判断当前用户是否在允许列表 if /i "%CURRENT_USER%" neq "%ALLOWED_USER%" ( echo 错误:你没有权限推送至%RESTRICTED_BRANCH%分支 exit /b 1 :: 返回非0,拒绝推送 ) ) :: 所有检查通过,允许推送 exit /b 0
使用说明:
- 把脚本保存为
pre-receive.cmd,放到你的Bonobo仓库的hooks目录下(路径一般是C:\Bonobo.Git.Server\App_Data\Repositories\[你的仓库名]\hooks)。 - 先取消注释
set > C:\temp\bonobo_hook_env.log这行,推送一次后查看日志,确认CURRENT_USER对应的变量名是否正确(比如有些环境下是USERNAME),然后替换脚本里的%REMOTE_USER%。 - 脚本编码要保存为ANSI,避免UTF-8带BOM导致执行乱码。
二、为什么pre-push脚本完全不生效?
这里有个核心误区:pre-push是Git客户端钩子,它只能放在本地开发者的Git仓库.git/hooks目录下,在用户执行git push时在本地触发。服务器端的Bonobo仓库hooks目录里放pre-push脚本是完全没用的——服务器端根本不会执行这个钩子!
如果你要在服务器端限制推送行为,应该用pre-receive或者update钩子(后者可以针对单个分支更精细控制),而不是pre-push。
三、环境配置排查要点
- 权限检查:确保Bonobo的
App_Data文件夹(包括下属的Repositories和hooks目录)给了IIS应用池身份(比如IIS AppPool\BonoboGitServer)读取和执行权限——Bonobo运行在IIS应用池下,必须能读取并执行钩子脚本。 - 匿名推送设置:你勾选了匿名访问但禁用匿名推送,所以用户推送时必须先登录Bonobo,钩子才能拿到正确的用户信息。如果钩子里拿不到用户变量,检查Bonobo的身份验证配置是否正常(比如是否启用了表单认证)。
- 脚本测试:可以在服务器上手动运行脚本,传入三个测试参数(比如
pre-receive.cmd abc123 def456 refs/heads/main),看是否能正确返回0或1,以及输出是否符合预期,排查脚本本身的语法错误。
内容的提问来源于stack exchange,提问作者Seeker
相关产品推荐
相关产品推荐

