在GitHub客户端的上下文中使用git pre-commit钩子

时间:2013-07-09 01:17:20

标签: 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" && 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'标志,但这没有任何区别。任何想法如何让客户找到咕噜声?

5 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:8)

如果您使用的是sourcetree(在Mac上),并且您有预提交和预推钩,请使用命令行打开sourcetree,而不是直接打开它,使用以下命令。

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

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

答案 2 :(得分:1)

如果您想运行一个可以获取环境的脚本($PATH等),您应该更改脚本的第一行:

#!/bin/sh

为:

#!/usr/bin/env sh

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

这样,如果您的可执行文件的路径在将来发生更改,或者在其他计算机上不同,则脚本仍然可以正常工作。 /usr/bin/env将获得运行脚本的用户的环境。这在某些人使用不同的包管理器但需要运行相同脚本的地方非常有用。否则,你可能会找到很多逻辑,寻找可以通过依赖正确填充的$PATH来避免的应用程序。

答案 3 :(得分:0)

Sindre Sorhus的优秀答案:

  OS X上的GUI应用程序不会加载.bashrc / .bash_profile中的内容,   这意味着他们不会有用户指定的$ PATH添加内容   /usr/local/bin,这是grunt二进制文件的位置。你也可以   指定完整路径或修复预提交挂钩中的$ PATH   在最高评论后添加此内容:PATH="/usr/local/bin:$PATH"

在我的情况下,这不起作用,因为我使用的是Single-expression functions,它存储了不同版本的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版本的节点模块的路径。

答案 4 :(得分:-1)

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