问题有两个部分:自动格式化代码,并检测何时不符合您的编码标准.
自动格式化代码不是真正要直接放在您和您的回购之间的东西.在提交前提交钩子中修改文件或尝试修改文件可能会造成混乱.因此,您正在使用的vcs并不重要.
使用工具通过编辑器格式化代码,或作为开发工作流程的一部分(手动或半自动)运行的过程将是适当的.例如,vim具有自动缩进代码的=函数,如其他人所提到的那样,这是一种可能性.
检测代码标准的需求需要一个cli工具来告诉您什么时候文件不符合编码标准 – 明显的选择是PHP Code Sniffer(phpcs) – 尽管它可以简单地是用来手动美化代码的工具(如果你使用一个)并检查它不会更改文件内容.
如果现有的标准符合您的风格,您可能需要编写自己的标准才能与phpcs一起使用.
您可以使用pre-commit hook在提交之前触发对代码的检查 – 如果发现代码错误,则会收到关于它们的通知,并且提交中止.您可以使用git commit –no-verify绕过您的预提交钩子
例:
$more foo.php
function bar() {
}
$git add foo.php
$git commit -v
running php/lint.php ... OK
running php/phpcs.php ... FAIL
phpcs -n -s --extensions=php,ctp --encoding=UTF-8 --standard=Cake '/tmp/cakephp-git-hooks'
FILE: foo.php
---------------------------------------
FOUND 3 ERROR(S) AFFECTING 2 LINE(S)
---------------------------------------
2 | ERROR | Space indented: Tabs for indents, spaces for alignment (Cake.WhiteSpace.ForceTabIndent)
2 | ERROR | Line indented incorrectly; expected 0 spaces, found 4 (Cake.WhiteSpace.ScopeIndent.Incorrect)
3 | ERROR | Space indented: Tabs for indents, spaces for alignment (Cake.WhiteSpace.ForceTabIndent)
---------------------------------------
Time: 0 seconds, Memory: 3.75Mb
$
(提交中止,代码不符合代码标准)
$git commit -v --no-verify -m "dummy commit"
running misc/happy-commits ... OK
[2.1 2c432f1] dummy commit
1 files changed, 3 insertions(+), 0 deletions(-)
create mode 100644 foo.php
$
(提交成功 – 尽管代码标准没有得到满足)