在GitHub客户端上下文中使用git预提交挂钩
我为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
#!/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