有没有更好的方法来编写git pre-commit钩子来检查提交中的任何php文件是否存在解析错误?

时间:2020-03-05 18:47:30  来源:igfitidea点击:

我到目前为止所拥有的是

#!/bin/sh

php_syntax_check()
{
    retval=0
    for i in $(git-diff-index --name-only --cached HEAD -- | grep -e '\.php$'); do
        if [ -f $i ]; then
            output=$(php -l $i)
            retval=$?
            if [ $retval -gt 0 ]; then
                echo "=============================================================================="
                echo "Unstaging $i for the commit due to the follow parse errors"
                echo "$output"
                git reset -q HEAD $i
            fi
        fi
    done

    if [ $retval -gt 0 ]; then
        exit $retval
    fi
}
php_syntax_check

解决方案

回答

很抱歉,如果它是题外话,但是在执行提交之前,我们不应该运行某种自动化测试(这意味着代码没有语法错误)吗?

回答

如果我们已经安装了php5-cli,则可以使用PHP编写pre-commit,并使用我们更熟悉的语法。

做更多类似的事情。

#!/usr/bin/php
<?php /* Your pre-commit check. */ ?>

回答

如果提交是部分提交(并非所有提交的工作树更改都已提交),那么这将给出错误的结果,因为它会测试工作副本而非暂存副本。

一种方法是:

git diff --cached --name-only --diff-filter=ACMR | xargs git checkout-index --prefix=$TMPDIR/ --
find $TMPDIR -name '*.php' -print | xargs -n 1 php -l

这会将复制的映像复制到暂存空间,然后在此处对它们运行test命令。如果任何文件在构建中包括其他文件,那么我们可能必须在测试树中重新创建整个暂存的映像,然后在其中测试更改的文件(请参阅:Git pre-commit hook:更改/添加的文件)。