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

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

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

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

3 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

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


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-12-12
?
森栏

TA贡献1810条经验 获得超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-12-12
  • 3 回答
  • 0 关注
  • 441 浏览

添加回答

举报

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