我为git创建了一个预提交脚本,该脚本在通过命令行运行时运行良好。这是脚本:
#!/bin/sh
#
# Pre-commit hooks
echo "Running unit tests..."
# Lint stuff before commiting
grunt runtests
RESULT=$?
[ $RESULT -ne 0 ] && echo "Tests (or tasks) failed, aborting the commit" && exit 1
echo "All tests passed, commiting your changes" && exit 0
我希望预提交也能通过GitHub客户端应用程序工作,但我无法做到这一点。执行了预提交脚本,但它抛出了一个错误。以下是它在客户端警报窗口中返回的全文:
Running unit tests...
.git/hooks/pre-commit: line 7: grunt: command not found
Tests (or tasks) failed, aborting the commit
(1)
由于某种原因,它找不到呼噜声。我重新安装了grunt cli,并使用了全局"-g"标志,但这并没有什么不同。你知道我怎样才能让客户找到咕噜吗?
OS X上的GUI应用程序不会加载.bashrc/.bash_profile中的内容,这意味着它们不会有用户指定的$PATH添加,如/usr/local/bin
,这是grunt二进制文件所在的位置。您可以指定完整路径,也可以在预提交挂钩中修复$PATH,方法是在顶部注释后添加:PATH="/usr/local/bin:$PATH"
如果您正在使用sourcetree(在Mac上),并且您有预提交和预推送挂钩,请使用命令行打开sourcetree,而不是使用以下命令直接打开它。
open /Applications/SourceTree.app/Contents/MacOS/SourceTree
现在,当你尝试提交和推送时,你的钩子就会起作用。我相信它也适用于github应用程序。
如果你想运行一个获取环境($PATH
等)的脚本,你应该将脚本的第一行改为:
#!/bin/sh
至:
#!/usr/bin/env sh
然后在没有硬编码路径的情况下调用grunt
。
这样,如果可执行文件的路径将来发生变化,或者在其他机器上发生变化,脚本仍然可以工作。/usr/bin/env
将获得运行脚本的用户的环境。这在有些人使用不同的包管理器但需要运行相同脚本的地方非常有用。否则,您可能会在寻找应用程序时遇到很多逻辑问题,而这些应用程序本可以通过依赖于正确填充的$PATH
来避免。
Sindre Sorhus的精彩回答:
OS X上的GUI应用程序不会加载.bashrc/.bash_profile中的内容,这意味着他们不会添加用户指定的$PATH,比如
/usr/local/bin
,这是grunt二进制文件所在的位置通过以下方式指定完整路径或修复预提交挂钩中的$path在顶部注释后添加此内容:PATH="/usr/local/bin:$PATH"
在我的情况下,这不起作用,因为我使用的是节点版本管理器,它存储不同版本的节点,并使升级和切换节点版本变得容易。它将每个Node版本的Node模块存储在一个单独的文件中。以下是我用来解决这个问题的代码:
#!/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
这将检查NVM,如果它存在,则加载它并使用它来查找当前使用的node版本的节点模块的路径。
作为一个简单的解决方法,指定通往grunt的完整绝对路径应该有效。如果您需要设置更多的环境,则需要研究github应用程序是如何为钩子构建环境的。