为了账号安全,请及时绑定邮箱和手机立即绑定

Git预提交钩子:更改/添加的文件

Git预提交钩子:更改/添加的文件

Git
撒科打诨 2019-10-28 11:00:31
我正在编写一个预提交的钩子。我想php -l对所有带有.php扩展名的文件运行。但是我被困住了。我需要获取暂存的新文件/已更改文件的列表。删除的文件应排除在外。我已经尝试过使用git diff和git ls-files,但是我认为我需要帮助。
查看完整描述

3 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

获得相同列表的更简洁的方法是:


git diff --cached --name-only --diff-filter=ACM

这将返回需要检查的文件列表。


但是仅php -l在工作副本上运行可能不是正确的选择。如果您正在执行部分提交,即仅选择当前工作集与HEAD的差异的子集作为提交,则测试将在您的工作集上运行,但将证明您的从未存在过的提交磁盘。


要正确执行此操作,应将整个暂存的图像提取到临时区域,然后在此处进行测试。


rm -rf $TEMPDIR

mkdir -p $TEMPDIR

git checkout-index --prefix=$TEMPDIR/ -af

git diff --cached --name-only --diff-filter=ACM | xargs -n 1 -I '{}' \bin\echo TEMPDIR/'{}' | grep \\.php | xargs -n 1 php -l

有关其他实现,请参见为Git构建更好的预提交挂钩。


查看完整回答
反对 回复 2019-10-28
?
ibeautiful

TA贡献1993条经验 获得超5个赞

这是我用于Perl检查的内容:


git diff --cached --name-status | while read st file; do

        # skip deleted files

        if [ "$st" == 'D' ]; then continue; fi

        # do a check only on the perl files

        if [[ "$file" =~ "(.pm|.pl)$" ]] && ! perl -c "$file"; then

                echo "Perl syntax check failed for file: $file"

                exit 1

        fi

done

对于PHP,它将如下所示:


git diff --cached --name-status | while read st file; do

        # skip deleted files

        if [ "$st" == 'D' ]; then continue; fi

        # do a check only on the php files

        if [[ "$file" =~ ".php$" ]] && ! php -l "$file"; then

                echo "PHP syntax check failed for file: $file"

                exit 1

        fi

done


查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 843 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信