Git钩子执行时缺失二进制文件:如何让终端工具在钩子中可用?
解决Git post-receive钩子无法识别yarn等工具的问题
Git钩子运行在非交互式、非登录shell环境下,默认不会加载你的用户shell配置(比如.bashrc/.profile),而终端里能访问yarn、nvm这些工具,正是因为这些配置文件把对应的路径加入了PATH环境变量。下面是几种不需要硬编码版本路径的解决方案:
方法1:加载用户的shell配置文件
直接在钩子开头source你的用户配置文件,让钩子继承终端里的环境变量:
#!/bin/sh # 替换成你的用户主目录路径,比如/home/ubuntu source /home/your-user/.profile git --work-tree=/path/to/www --git-dir=/path/to/git/test_CI.git checkout -f yarn build
如果你的nvm等配置是写在.bashrc里,因为非交互式shell默认不加载.bashrc,可以直接source它:
source /home/your-user/.bashrc
这种方法能一次性把终端里所有可用工具的路径都加入钩子环境,后续更新nvm、node版本也不用修改钩子,最省心。
方法2:直接加载NVM初始化脚本
如果不想加载整个用户配置,只需要nvm管理的工具,可以直接source nvm的初始化脚本:
#!/bin/sh # 替换成你的nvm安装路径,通常在用户主目录下的.nvm文件夹 source /home/your-user/.nvm/nvm.sh # 可选:如果项目需要特定Node版本,可指定(或在项目根目录放.nvmrc文件自动加载) nvm use v12.18.3 git --work-tree=/path/to/www --git-dir=/path/to/git/test_CI.git checkout -f yarn build
加载nvm脚本后,它会自动把当前激活的Node版本对应的yarn、npm等工具路径加入PATH,后续更新版本时只要调整nvm use的版本号(或用.nvmrc)即可,不用硬编码工具路径。
方法3:手动导出完整PATH(临时方案)
先在终端里运行echo $PATH,复制输出的完整路径,然后在钩子开头导出:
#!/bin/sh # 替换成你终端里echo $PATH得到的内容 export PATH="/home/your-user/.nvm/versions/node/v12.18.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" git --work-tree=/path/to/www --git-dir=/path/to/git/test_CI.git checkout -f yarn build
这种方法的缺点是,当你更新Node版本或安装新工具后,需要手动更新钩子中的PATH,适合临时应急使用。
内容的提问来源于stack exchange,提问作者user1511417
相关产品推荐
相关产品推荐

