11

我为 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”标志,但这没有任何区别。有什么想法可以让客户找到咕噜声吗?

4

5 回答 5

22

OS X 上的 GUI 应用程序不会加载 .bashrc/.bash_profile 中的内容,这意味着它们不会有用户指定的 $PATH 添加/usr/local/bin,例如 grunt 二进制文件所在的位置。您可以指定完整路径或修复预提交挂钩中的 $PATH,方法是在顶部注释后添加:PATH="/usr/local/bin:$PATH"

于 2013-07-09T20:25:37.800 回答
13

如果您使用的是 sourcetree(在 Mac 上)并且您有 pre-commit 和 pre-push 挂钩,请使用命令行打开 sourcetree 而不是直接打开它,使用以下命令。

open /Applications/SourceTree.app/Contents/MacOS/SourceTree

现在,当您尝试提交和推送时,您的钩子将起作用。我相信它也适用于 github 应用程序。

于 2015-11-07T22:01:04.053 回答
1

如果你想运行一个脚本来获取你的环境($PATH等),你应该改变脚本的第一行:

#!/bin/sh

至:

#!/usr/bin/env sh

然后grunt在没有硬编码路径的情况下调用。

这样,如果您的可执行文件的路径在未来发生变化或在其他机器上不同,该脚本仍然可以工作。 /usr/bin/env将获得运行脚本的用户的环境。这在某些人使用不同的包管理器但需要运行相同的脚本的地方非常有用。否则,您最终可能会使用大量逻辑来寻找可以通过依赖正确填充的$PATH.

于 2014-08-13T11:59:45.223 回答
0

Sindre Sorhus 的出色回答:

OS X 上的 GUI 应用程序不会加载 .bashrc/.bash_profile 中的内容,这意味着它们不会有用户指定的 $PATH 添加 /usr/local/bin,例如 grunt 二进制文件所在的位置。您可以指定完整路径或修复预提交挂钩中的 $PATH,方法是在顶部注释后添加:PATH="/usr/local/bin:$PATH"

就我而言,这不起作用,因为我使用的是Node Version Manager,它存储不同版本的 Node 并可以轻松升级和切换 Node 版本。它将每个 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 版本的节点模块的路径。

于 2017-04-12T13:58:08.717 回答
-1

作为一个简单的解决方法,指定 grunt 的完整绝对路径应该可以工作。如果您需要设置更多环境,则需要研究 github 应用程序如何为钩子构建环境。

于 2013-07-09T07:04:34.123 回答