Windows下Git post-receive钩子不触发问题求助
解决Windows Server 2008 R2上Git HTTP后端post-receive钩子不触发的问题
根据你的描述,手动执行钩子脚本正常但推送时没反应,这大概率是Apache服务账户的权限问题、钩子脚本的执行上下文差异,或者虚拟主机配置的正则错误导致的。下面一步步帮你排查解决:
1. 修正虚拟主机的ScriptAliasMatch正则
你的虚拟主机配置里的ScriptAliasMatch有明显的语法错误(混入了无关的[Apache Git server on Windows^/]内容),这会导致git-receive-pack请求无法被正确路由到Git后端,钩子自然不会触发。把这部分替换为官方推荐的正确正则:
ScriptAliasMatch \ "(?x)^/(.*/(HEAD | \ info/refs | \ objects/(info/[^/]+ | \ [0-9a-f]{2}/[0-9a-f]{38} | \ pack/pack-[0-9a-f]{40}\.(pack|idx)) | \ git-(upload|receive)-pack))$" \ "C:/Program Files/Git/mingw64/libexec/git-core/git-http-backend.exe/$1"
修改后重启Apache服务,确保配置生效。
2. 调整钩子脚本的shebang与日志输出
你的钩子脚本shebang路径因为包含空格,需要用引号包裹才能被正确解析,同时添加详细日志来确认钩子是否触发:
在裸仓库的hooks/post-receive文件中(注意不要加.sh后缀),替换为以下内容:
#!"C:/Program Files/Git/usr/bin/sh.exe" # 写入触发日志到Apache有权限的目录 echo "=== Post-receive hook triggered at $(date) ===" >> "C:/xampp/logs/git-hook.log" # 切换到网站工作目录,失败则记录错误并退出 cd "C:/xampp/htdocs/webapp/myProject/" || { echo "Failed to enter working directory" >> "C:/xampp/logs/git-hook.log"; exit 1; } # 清除GIT_DIR环境变量(避免Git误判当前为裸仓库) unset GIT_DIR # 执行pull并记录所有输出(包括错误信息) echo "Starting git pull..." >> "C:/xampp/logs/git-hook.log" git pull origin master >> "C:/xampp/logs/git-hook.log" 2>&1 echo "Git pull completed with exit code: $?" >> "C:/xampp/logs/git-hook.log" # 更新服务器信息 git update-server-info >> "C:/xampp/logs/git-hook.log" 2>&1 echo "=== Hook execution finished ===" >> "C:/xampp/logs/git-hook.log"
注意:不要用exec命令,它会替换当前shell进程,导致后续命令无法执行。
3. 确保Apache服务账户有足够权限
Git HTTP后端是通过Apache的服务账户运行的,这个账户默认可能没有权限访问你的仓库、网站目录或Git命令:
- 打开服务管理器,找到XAMPP的Apache服务,查看它的登录身份(通常是
Local System或自定义账户)。 - 给以下路径添加该账户的读取、写入、执行权限:
- 裸仓库目录:
C:/xampp/htdocs/webapp/MyProject.git(包括hooks子目录) - 网站工作目录:
C:/xampp/htdocs/webapp/myProject/ - Git安装目录:
C:/Program Files/Git/ - 日志目录:
C:/xampp/logs/
- 裸仓库目录:
- 右键目录 → 属性 → 安全 → 编辑 → 添加服务账户(比如
NT AUTHORITY\SYSTEM对应Local System),勾选相应权限。
4. 验证钩子是否触发
执行一次git push origin master,然后查看C:/xampp/logs/git-hook.log:
- 如果日志有内容:说明钩子已经触发,查看
git pull的错误信息(比如权限不足、分支名称不匹配等),针对性解决。 - 如果日志为空:说明钩子没触发,检查以下几点:
- 钩子文件名是否为
post-receive(无后缀),且在裸仓库的hooks目录下。 - 在裸仓库中执行
git config http.receivepack true,确保允许接收推送并触发钩子。 - 检查Apache的错误日志(
C:/xampp/apache/logs/error.log),看是否有Git后端相关的报错。
- 钩子文件名是否为
额外提示
- 如果你用PowerShell脚本,确保Apache服务账户能访问
powershell.exe,并且脚本路径用绝对路径(比如C:/xampp/htdocs/webapp/MyProject.git/hooks/post-receive.ps1),避免相对路径的问题。 - 手动执行脚本时是用你的用户账户,和Apache的服务账户环境不同,所以手动正常不代表钩子能正常运行,权限是核心问题。
内容的提问来源于stack exchange,提问作者Nomeaning25
相关产品推荐
相关产品推荐

