我想要自动过程,当我提交我的php-cs-fixer
trn 文件并修复所有添加到提交的文件时,也许 PhpStorm 有一些机会,在提交或推送之前运行外部工具。我发现只有在提交之后,但我不需要之后,需要之前。我尝试调整我的 git,使用我在项目文件中创建的预提交事件,例如,只是没有扩展名
sudo gedit .git/hooks/pre-commit
然后添加代码
#!/usr/bin/env bash
ROOT="/home/ivan/host/master"
echo "php-cs-fixer pre commit hook start"
PHP_CS_FIXER="php-cs-fixer"
HAS_PHP_CS_FIXER=false
if [ -x php-cs-fixer ]; then
HAS_PHP_CS_FIXER=true
fi
if $HAS_PHP_CS_FIXER; then
git status --porcelain | grep -e '^[AM]\(.*\).php$' | cut -c 3- | while read line; do
$PHP_CS_FIXER fix --config-file=$ROOT/.php_cs --verbose "$line";
git add "$line";
done
else
echo ""
echo "Please install php-cs-fixer, e.g.:"
echo ""
echo " composer require --dev fabpot/php-cs-fixer:dev-master"
echo ""
fi
echo "php-cs-fixer pre commit hook finish"
然后比较当我为某个文件运行 php-cs-fixer 时,
php-cs-fixer fix src/AppBundle/Services/OutboundInvoiceService.php
然后检查文件并为此文件有许多修复程序部分,然后签出更改并为此文件添加空行并提交它,预提交不起作用,只有我在我的 repo 提交中的空行,没有 php-cs-固定器工作。我究竟做错了什么 ?
我添加未使用的命名空间的示例,php-cs-fixer 必须删除它并添加一些其他修复,但添加文件后我只有未使用的命名空间:(
仅当我创建 php 文件时才有效
#!/usr/bin/php
<?php
/**
* .git/hooks/pre-commit
*
*/
/**
* collect all files which have been added, copied or
* modified and store them in an array called output
*/
exec('git diff --cached --name-status --diff-filter=ACM', $output);
foreach ($output as $file) {
$fileName = trim(substr($file, 1) );
/**
* Only PHP file
*/
if (pathinfo($fileName,PATHINFO_EXTENSION) == "php") {
/**
* Check for error
*/
$lint_output = array();
exec("php -l " . escapeshellarg($fileName), $lint_output, $return);
if ($return == 0) {
/**
* PHP-CS-Fixer && add it back
*/
exec("php-cs-fixer fix {$fileName}; git add {$fileName}");
} else {
echo implode("\n", $lint_output), "\n";
exit(1);
}
}
}
exit(0);
在 git add file before push 之后,运行这个文件。
但这是一种复杂的方法,因为在提交文件之后,我需要运行这个脚本,但它可以工作。
我的问题是如何使用 git hooks pre-commit 自动执行此过程?