用git钩子脚本在提交代码对php文件进行语法检查

在git版本库的 .git/hooks/ 目录下建立名为pre-commit的脚本文件, 它会在每次代码提交之前被调用

if git-rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

set -e
changed_files=`git diff-index --cached --name-only $against --`
for f in $changed_files ;do
    ext=${f##*.}
    if test "$ext" = "php" ;then
        php -l $f
    fi
done

有了这个脚本,就可以避免带有语法错误的文件被提交. 但上面的脚本有点小bug.

这几天发现从git库中删除文件时总是失败, 总是提示

Could not open input file: xxx.php

起初没太在意, 以为是版本库出现了什么损坏. 后来发现, 这种现象只发生在php文件上,删除其他的文件没有问题. 于是想起了钩子脚本pre-commit, 问题就出在这个脚本, 当我删除一个已经存在的php文件时, 这个脚本依旧会调用php -l检查语法错误, 而实际上这个文件被删了,就会提示找不到文件.

只要在检查语法前加一行判断文件是否存在的条件就ok了.

if git-rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

set -e
changed_files=`git diff-index --cached --name-only $against --`
for f in $changed_files ;do
    ext=${f##*.}
    if test "$ext" = "php" ;then
        if test -e "$f";then
            php -l $f
        fi
    fi
done

Posted via UltraBlog.vim.

Comments