git environment vs precommit hook

时间:2017-03-02 20:27:46

标签: git shell npm

我有一个有角度的网络项目。我试图运行一个shell脚本作为git的预先提交挂钩。

这是脚本本身:

#!/bin/bash

echo "finding ESLint..."

ESLINT="$(git rev-parse --show-toplevel)/cf-itr-ui/node_modules/.bin/eslint"

# make sure eslint is installed:
if [[ ! -x "$ESLINT" ]]; then
    echo -e "\t\033[41mESLint doesn't seem to be installed, or I can't find it :(\033[0m "
    exit 1
fi

echo "ESLint found!"

for f in $(git diff --name-only | grep -E '\.(js|jsx)$')
do
    echo "linting '$f'..."
    git show ":$f" | "$ESLINT" --stdin --stdin-filename "$f"
    if [ $? -ne 0 ]; then
        echo "ESLint failed on staged file '$f'. Please check your code and try again. You can run ESLint manually via npm run eslint."
        exit 1 # exit with failure status
    fi
done

在终端中手动运行此脚本 - 一切都按预期工作。很简单吧?坚持下去 - 它会变得很奇怪。

当作为git钩子执行时,脚本会运行,因为我看到它正在查找并找到eslint,但for循环确实.....没有。所以它只是发布提交 - 根本没有linting。

让另一位开发人员克隆整个仓库。结果相同。脚本可以手动运行,查找文件并对其进行删除。作为一个钩子运行?找到eslint,但没有任何东西。如果第三个开发人员尝试了它 - 将repo克隆到一个新目录中,并且他的版本可以作为钩子和手工完成。

我试图在我们3之间找到git env / config vars的一些区别,但到目前为止还没有运气。

如果我从项目树的任何地方运行git diff --name-only命令 - 我会看到更改,所以我认为这不仅仅是路径问题。

所以它就像钩子有一个不同的“shell”正在执行,所以它没有从命令得到相同的结果?我不知道。在这一点上,我只是喋喋不休。有谁见过这个?

在有人要求之前:所有3个开发者都在Mac上。到目前为止我才发现差异:

它的开发人员是git版本2.8.1。 两个非工作的开发人员在2.10.2

2.8和2.10之间的钩子处理方式是否有一些变化?

TIA

1 个答案:

答案 0 :(得分:0)

在" git diff during pre-commit hook results in Not a git repository"中,您需要确保未设置GIT_DIR。

unset GIT_DIR

(在剧本的开头)