求助:Bonobo Windows Git Server的post-receive钩子编写
搞定Bonobo Git服务器的Post-Receive钩子,自动触发Slack通知
嘿,我来帮你搞定这个Bonobo上的钩子配置!我之前折腾过Windows上Git服务器的钩子,知道这里面容易踩路径和权限的坑,直接给你一步步来的方案:
1. 先找对钩子文件的位置
Bonobo的每个仓库都有自己的hooks文件夹,路径大概是:C:\BonoboGitServer\Repositories\[你的仓库名称]\hooks
你需要在这里创建一个没有扩展名的文件,名字就叫post-receive——Git只会识别这个名字的钩子文件。
2. 编写Post-Receive钩子脚本
因为Bonobo用的是Windows版Git的bash环境来执行钩子,所以脚本要写bash语法,开头的shebang必须指向你安装的Git的bash.exe路径(比如你提到的SmartGit里的Git)。
下面是完整的示例脚本,你可以根据自己的实际路径修改:
#!/bin/bash # 替换成你实际的Git可执行文件路径(SmartGit里的Git) GIT_PATH="/c/Program Files (x86)/SmartGit/git/bin/git.exe" # 替换成你已有的Slack通知Python脚本的绝对路径 PYTHON_SCRIPT="/c/Users/你的用户名/Documents/slack_notify.py" # 可选:设置编码,避免中文提交消息乱码 export LC_ALL=zh_CN.UTF-8 # 从Git传入的参数中拿到最新提交的哈希值($2是newrev,即推送后的最新commit) NEW_COMMIT=$2 # 获取最后一次提交的关键信息:提交者姓名|邮箱|提交消息 # %an=提交者姓名,%ae=邮箱,%s=提交主题(消息),用|分隔方便后续拆分 COMMIT_DETAILS=$("$GIT_PATH" log -1 --pretty=format:"%an|%ae|%s" "$NEW_COMMIT") # 拆分信息为三个独立变量 IFS='|' read -r COMMITTER_NAME COMMITTER_EMAIL COMMIT_MSG <<< "$COMMIT_DETAILS" # 调用你的Python脚本,把三个参数传进去(和你现有脚本的参数对应) python "$PYTHON_SCRIPT" "$COMMITTER_NAME" "$COMMITTER_EMAIL" "$COMMIT_MSG"
3. 关键注意事项(避坑指南)
- 路径一定要用绝对路径:不管是Git、Python脚本还是其他文件,都别用相对路径,bash环境的工作目录可能和你想的不一样。
- 权限设置:Bonobo运行的用户(一般是IIS应用池用户
IIS AppPool\BonoboGitServer)需要有:- 读取和执行
post-receive文件的权限 - 访问Git可执行文件的权限
- 读取和执行你的Python脚本的权限
- 读取和执行
- 测试钩子:别等推送再测试!可以手动打开Git Bash,进入钩子所在目录,执行:
这里的./post-receive deadbeef123 abc4567 refs/heads/maindeadbeef123和abc4567随便填两个合法的哈希前缀,只要能触发脚本就行,看Slack能不能收到消息。 - 编码问题:如果提交消息有中文,一定要加
export LC_ALL=zh_CN.UTF-8,否则bash传递给Python的内容会乱码。
4. 验证推送触发
配置好之后,本地做一次提交推送到Bonobo的origin仓库,检查Slack是否收到了包含提交者信息和提交消息的通知——如果没收到,先看钩子有没有执行,可以在脚本里加一行echo "钩子执行了" >> /c/tmp/hook_log.txt来排查日志。
内容的提问来源于stack exchange,提问作者sniperd




