如何将git diff输出的变更文件作为Laravel Pint的参数?
解决Laravel Pint仅格式化Git上次提交变更文件的问题
你之前的命令错误在于多写了-o /dev/stdout,git diff --name-only默认就会把结果输出到标准输出,加了-o参数后Git会误以为你要把输出写入到指定文件,而/dev/stdout不在你的仓库目录下,所以触发了报错,之后Pint因为没收到有效参数就默认格式化了所有文件。
下面是几种可行的解决方法:
方法1:使用xargs传递参数
这是最稳妥的方式,能自动把Git输出的每行文件名转换成Pint的位置参数:
git diff --name-only HEAD^ HEAD | xargs ./vendor/bin/pint
如果你的项目里存在带空格的文件名(虽然不推荐),可以加上-d '\n'参数确保xargs按换行分割:
git diff --name-only HEAD^ HEAD | xargs -d '\n' ./vendor/bin/pint
方法2:使用命令替换
通过命令替换直接把Git的输出结果作为Pint的参数:
./vendor/bin/pint $(git diff --name-only HEAD^ HEAD)
如果担心文件名含空格的问题,可以先设置环境变量IFS仅按换行分割:
IFS=$'\n' ./vendor/bin/pint $(git diff --name-only HEAD^ HEAD)
方法3:避免无变更时格式化全部文件
如果上次提交没有变更文件,Git会输出空内容,此时Pint会默认格式化所有文件。可以加个判断逻辑,仅在有变更文件时执行:
changed_files=$(git diff --name-only HEAD^ HEAD) if [ -n "$changed_files" ]; then ./vendor/bin/pint $changed_files fi
内容的提问来源于stack exchange,提问作者PizzaIsLove
相关产品推荐
相关产品推荐

