Git post-merge钩子中npm run build脚本无法运行的原因排查
先确认钩子是否正常运行
首先检查touch /home/jt/project/backend/backend/wsgi.py是否生效:查看该文件的修改时间是否与你执行git pull的时间一致。
如果文件时间没变化,说明钩子根本没运行,优先处理权限问题:
给post-merge脚本添加可执行权限:chmod +x ~/project/.git/hooks/post-merge如果文件时间有变化,说明钩子在运行,但
npm run build执行失败或无输出,按以下步骤排查:
排查npm命令执行问题
1. 捕获错误输出
Git钩子默认会隐藏命令的标准错误输出,你可以修改脚本把日志写入文件,直接查看npm的报错信息:
#!/bin/sh # 把npm的输出和错误都写入日志文件 /home/jt/nvm/versions/node/v18.12.0/bin/npm run build --prefix /home/jt/project/frontend >> /home/jt/npm-build.log 2>&1 # 打印npm的退出码,0表示成功,非0表示失败 echo "npm exit code: $?" >> /home/jt/npm-build.log touch /home/jt/project/backend/backend/wsgi.py
执行git pull后,查看/home/jt/npm-build.log即可定位具体错误。
2. 检查环境变量差异
Git钩子的执行环境和你平时用的交互式shell不一样,可能缺少npm运行所需的环境变量。可以对比两种环境的变量:
修改钩子脚本打印环境变量:
#!/bin/sh # 输出钩子的环境变量到文件 env >> /home/jt/hook-env.log /home/jt/nvm/versions/node/v18.12.0/bin/npm run build --prefix /home/jt/project/frontend >> /home/jt/npm-build.log 2>&1 touch /home/jt/project/backend/backend/wsgi.py
然后在交互式shell里执行env >> /home/jt/shell-env.log,对比两个文件的差异,重点关注NODE_ENV、NODE_PATH等和Node/npm相关的变量,必要时在钩子脚本里手动添加缺失的变量。
3. 切换工作目录后执行npm
有时候--prefix参数可能不如直接切换工作目录可靠,修改脚本先进入frontend目录再执行命令:
#!/bin/sh cd /home/jt/project/frontend || exit 1 /home/jt/nvm/versions/node/v18.12.0/bin/npm run build touch /home/jt/project/backend/backend/wsgi.py
|| exit 1保证如果切换目录失败,脚本直接退出,避免后续命令执行出错。
4. 确认npm路径的有效性
虽然你用了绝对路径,但可以先验证该路径的npm是否能在钩子环境中正常运行:
在钩子脚本里添加测试命令:
#!/bin/sh /home/jt/nvm/versions/node/v18.12.0/bin/npm --version >> /home/jt/npm-test.log /home/jt/nvm/versions/node/v18.12.0/bin/npm run build --prefix /home/jt/project/frontend >> /home/jt/npm-build.log 2>&1 touch /home/jt/project/backend/backend/wsgi.py
如果npm --version能正常输出版本号,说明路径没问题;否则可能是该npm文件权限不足,或者Node版本在钩子环境中无法运行。
内容的提问来源于stack exchange,提问作者user11909157

