Git预提交挂钩在GitHub for mac中失败(在命令行上工作)

isN*_*247 21 git github github-for-mac atlassian-sourcetree

我创建了一个非常简单的预提交脚本: -

#!/usr/bin/env sh

# Run tests
npm test
if [ $? -ne 0 ]; then
  echo "Tests failed. Aborting.."
  exit 1
fi

exit 0
Run Code Online (Sandbox Code Playgroud)

当我git commit在命令行运行时(测试失败),我得到了预期的退出1和消息Tests failed. Aborting...

但是,如果我使用GitHub for Mac,我得到:

.git/hooks/pre-commit: line 5: npm: command not found
Tests failed. Aborting..
 (256)
Run Code Online (Sandbox Code Playgroud)

我猜测它npm不适用于GitHub for Mac正在使用的执行环境,但我一直在试图弄清楚如何解决这个问题.

isN*_*247 25

解决.由于全局安装的节点模块最终/usr/local/bin需要在我的预提交开始时添加以下内容:

PATH=$PATH:/usr/local/bin:/usr/local/sbin
Run Code Online (Sandbox Code Playgroud)

即既追加/usr/local/bin/usr/local/sbinPATH在执行点.


Rus*_*oms 6

在GUI环境(如Github Desktop和Sourcetree)中可用的$ PATH变量与终端中可用的变量不同。默认情况下,GUI环境中可用的$ PATH找不到您的节点模块。如上一个答案所述,您可以通过添加以下命令来确保/ usr / local / bin在路径中

PATH=$PATH:/usr/local/bin:/usr/local/sbin
Run Code Online (Sandbox Code Playgroud)

在我的情况下,这不起作用,因为我使用的是Node Version Manager,它存储Node的不同版本,并易于升级和切换Node版本。它将每个版本的Node的node_modules存储在单独的文件中。这是我用来解决此问题的代码:

#!/usr/bin/env bash

PATH="/usr/local/bin:$PATH"

if [ -f $HOME/.nvm/nvm.sh ]
then
  . $HOME/.nvm/nvm.sh
  PATH="$HOME/.nvm/versions/node/$(nvm current)/bin:$PATH"
fi
Run Code Online (Sandbox Code Playgroud)

这将检查NVM,如果存在NVM,则将其加载并使用它为当前使用的Node版本查找到节点模块的路径。如果您只是尝试访问节点模块并且不需要任何特殊操作,则可以跳过添加sbin文件夹的操作,例如/usr/local/sbin

  • “通过添加可以确保/ usr / local / bin在路径中” –通过添加到何处? (2认同)