You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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命令:

  1. 打开服务管理器,找到XAMPP的Apache服务,查看它的登录身份(通常是Local System或自定义账户)。
  2. 给以下路径添加该账户的读取、写入、执行权限:
    • 裸仓库目录:C:/xampp/htdocs/webapp/MyProject.git(包括hooks子目录)
    • 网站工作目录:C:/xampp/htdocs/webapp/myProject/
    • Git安装目录:C:/Program Files/Git/
    • 日志目录:C:/xampp/logs/
  3. 右键目录 → 属性 → 安全 → 编辑 → 添加服务账户(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:41:02