自动化代码格式化 Git

13

我正在开发一个(PHP)项目,每次提交代码时都存在一些不符合编码规范的问题。我使用git进行版本控制。是否有自动化的代码格式化方法,使得所有的代码都保持干净整洁?


4
在某些情况下,你可能会想要违反自动化规则,因此最好在提交更改之前手动运行代码格式化程序。 - Alexander Pavlov
是的,确实这是一个好观点。 - soupdiver
5个回答

19
这个问题分为两部分:自动格式化代码和检测代码是否符合编码标准。自动格式化代码不是你想直接放在版本库中间的东西。在pre-commit钩子中修改文件或尝试修改文件可能会弄乱它们。因此,无论你使用什么版本控制系统都没有关系。适当的做法是使用工具通过编辑器或作为你开发过程中运行的流程(手动或半自动)来格式化代码。例如,vim有一个=函数可以自动缩进代码,正如其他人提到的Pear's beautifier也是其中一种可能的选择。
检测代码标准偏差需要一个CLI工具,用于告诉您文件是否符合编码标准 - 显而易见的选择是 PHP Code Sniffer (phpcs) - 尽管它也可以是您手动美化代码时使用的相同工具,并检查它是否更改了文件内容。
如果没有现有的标准与您的样式匹配,则可能需要编写自己的标准以与 phpcs 一起使用。
您可以使用pre-commit hook在提交之前触发对代码的检查 - 如果发现代码错误,您将收到通知并中止提交。您可以使用 git commit --no-verify 跳过预提交钩子。
您可能会发现这个存储库有用:https://github.com/AD7six/git-hooks 示例:
$ more foo.php 
<?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
$

提交成功 - 即使代码标准未达到要求


2

Git知道钩子。您可以利用它们在每次提交被接受到存储库之前运行某种形式的checkstyle应用程序。检查存储库中的.git/hooks/文件。这样可以拒绝提交。不确定是否可以修改提交。


2

有一些“PHP美化器”脚本(其中一个在PEAR中),你可以从git的提交钩子中调用它们。


2
你可以使用PHP_Beautifier美化你的php脚本。
但我认为每次提交都进行美化可能会导致大量修改行,这将使得难以理解diff命令的输出。

你有使用过这个工具的经验吗?版本是0.1,上次更新是1.5年前。 - soupdiver
我仍然使用@skelle。至少为了格式化SO问题附带的每个未经格式化的代码段。通常我使用Netbeans和快捷方式<kbd>Ctrl</kdb>+<kbd>Shift</kdb>+<kbd>F</kdb>。 - Shiplu Mokaddim
NetBeans的格式化样式设置在“选项>编辑器>格式化”中,并可通过快捷键“Ctrl+Alt+F”对整个文件或选择进行运行。 - Vladimir Vukanac

1

Git有提交钩子,允许您在提交之前执行命令。不建议使用这些提交钩子来更改源代码,因为这可能会导致意外的结果。

但是,您可以利用git预提交钩子来执行PHP代码嗅探器。 PHP代码嗅探器是一种工具,可通过PEAR安装,它将指示您偏离了标准的位置。您可以设置自己的标准或使用现有的标准,如PEAR标准。提交钩子可以设置为显示所有违规行为(非标准代码)并停止提交。如果代码符合标准,则可以允许提交。

这是PHP代码嗅探器的链接:

http://pear.php.net/package/PHP_CodeSniffer/redirected

这是一个关于git预提交钩子的不错示例,用于php代码嗅探器。

https://gist.github.com/1892861

一些关于Git提交钩子的文档:

http://book.git-scm.com/5_git_hooks.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接