Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在GitHub客户端上下文中使用git预提交挂钩_Git_Unix_Github_Gruntjs_Github For Mac - Fatal编程技术网

在GitHub客户端上下文中使用git预提交挂钩

在GitHub客户端上下文中使用git预提交挂钩,git,unix,github,gruntjs,github-for-mac,Git,Unix,Github,Gruntjs,Github For Mac,我为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" && exi

我为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'标志,但这没有什么区别。有什么想法可以让客户端找到grunt吗?

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

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

如果要运行获取环境的脚本(
$path
等),您应该从以下内容更改脚本的第一行:

#!/bin/sh
致:

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


这样,如果将来可执行文件的路径发生变化,或者在其他机器上不同,脚本仍然可以工作
/usr/bin/env
将获取脚本运行时的用户环境。在有些人使用不同的包管理器但需要运行相同脚本的地方,这确实很有用。否则,如果您使用的是sourcetree(在Mac上),并且您有预提交和预推钩子,请使用命令行打开sourcetree,而不是使用以下命令直接打开sourcetree,那么您可能会使用大量逻辑来查找应用程序,而这些应用程序本可以通过正确填充的
$PATH

来避免

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

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

Sindre Sorhus的精彩回答:


OS X上的GUI应用程序不会加载.bashrc/.bash\u配置文件中的内容, 这意味着它们不会像这样添加用户指定的$PATH
/usr/local/bin
,这是grunt二进制文件所在的位置。你也可以 在预提交钩子中指定完整路径或修复$path,方法如下 在顶部注释后添加此项:
PATH=“/usr/local/bin:$PATH”

在我的例子中,这不起作用,因为我正在使用,它存储节点的不同版本,并使升级和切换节点版本变得容易。它将每个版本的节点的节点模块存储在单独的文件中。下面是我用来解决这个问题的代码:

#!/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版本的节点模块的路径。

在使用SourceTree运行预提交钩子时,我遇到了类似的问题。终端正在从预提交运行“grunt测试”,但未从SourceTree运行。谢谢它起作用了。如果这对您不起作用,您正在尝试使用节点模块,并且已安装节点版本管理器,请参阅,以获取允许$PATH查找节点模块的代码,关于这个问题,我也在下面添加了它。@coding\u idiot您也可以尝试将
sh
更改为
bash
,看看这是否符合您的要求。我只使用过像这样的
bash
,但我在里面放了
sh
,因为它是您最初使用的shell。哇。这是一团糟。您是否向Atlassian报告了此错误?在更新版本的源代码树中,它可以正常工作。无需打开或使用上述软件hack@AamirAfridi,它不仅仅适用于我最新版本的SourceTree。我仍然需要从命令行.Mojave和最新的源代码树4.0.1(234)打开。没有黑客就不能工作。这个代码应该在哪里?如何/何时启动?
#!/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