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

时间:2012-10-14 11:56:01

标签: git github atlassian-sourcetree github-for-mac

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

#!/usr/bin/env sh

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

exit 0

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

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

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

我猜测GitHub for Mac正在使用的执行环境无法使用npm,但我一直在试图找出解决方法。

3 个答案:

答案 0 :(得分:25)

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

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

即。在执行时将/usr/local/bin/usr/local/sbin附加到PATH

答案 1 :(得分:4)

Github Desktop和Sourcetree等GUI环境中可用的$ PATH变量与终端中可用的变量不同。默认情况下,GUI环境中可用的$ PATH无法找到您的节点模块。如前面的答案中所述,您可以通过添加

来确保/ usr / local / bin位于路径中
List<Object>

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

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

这将检查NVM,如果存在,则加载它并使用它来查找当前使用的Node版本的节点模块的路径。如果您只是尝试访问节点模块而不需要获得任何特殊内容,则可以跳过添加sbin folder,例如#!/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

答案 2 :(得分:0)

对我来说,这是因为我没有安装从预提交中调用的依赖项。在我的情况下,这是composer,因此brew install composer帮助了我。

对于以后的窥视,请通过在您喜欢的文本编辑器中打开your-project-directory/.git/hooks/pre-commit来检查是否缺少在预提交文件中调用的依赖项,并根据需要安装缺少的依赖项。