【发布时间】:2012-03-13 21:13:12
【问题描述】:
我正在开发一个项目 (PHP),每次提交时,代码约定都会出现一些中断。我正在使用 git 进行版本控制。有没有办法自动格式化代码,让所有代码保持干净?
【问题讨论】:
-
在不可避免的情况下,您会想要破坏自动规则,因此最好在提交更改之前在您的代码上手动运行格式化程序。
-
是的,这确实是个好点
标签: php git code-formatting
我正在开发一个项目 (PHP),每次提交时,代码约定都会出现一些中断。我正在使用 git 进行版本控制。有没有办法自动格式化代码,让所有代码保持干净?
【问题讨论】:
标签: php git code-formatting
Git 知道钩子。您可以利用它们在每次提交被接受到存储库之前运行某种形式的 checkstyle 应用程序。检查存储库中.git/hooks/ 中的文件。以这种方式拒绝提交是可能的。我不确定你是否可以修改提交。
【讨论】:
周围有一些“PHP 美化器”脚本(其中一个在 PEAR 中),您可以从 git 的提交钩子中调用它们。
【讨论】:
您可以使用PHP_Beautifier 来美化您的php 脚本。
但我认为在每次提交中美化可能会导致大量修改行。这将很难理解diff 命令的输出。
【讨论】:
Options>Editor>Formatting 中设置,并在整个文件或选择上使用快捷方式Ctrl+Alt+F 运行。
这个问题有两个部分:自动格式化代码,以及检测代码何时不符合您的编码标准。
自动格式化代码并不是你想直接放在你和你的 repo 之间的东西。在pre-commit 挂钩中修改文件或尝试修改文件可能会造成混乱。因此,您使用什么 vcs 并不重要。
使用工具通过编辑器或作为开发工作流程的一部分运行(手动或半自动)的过程来格式化代码是合适的。例如,vim 具有自动缩进代码的= 功能,正如其他人所提到的,Pear's beautifier 是一种可能。
检测代码标准偏差需要一个 cli 工具来告诉您文件何时不符合编码标准 - 显而易见的选择是 PHP Code Sniffer (phpcs) - 尽管它可能只是同一个工具你用来手动美化你的代码(如果你使用的话)并检查它不会改变文件内容。
如果现有标准都不符合您的风格,您可能需要编写自己的标准以与 phpcs 一起使用。
您可以在提交代码之前使用pre-commit hook 触发对代码的检查 - 如果发现代码错误,您将收到有关它们的通知并中止提交。你可以使用git commit --no-verify绕过你的预提交钩子
你可能会发现这个 repo 很有用: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
$
(提交成功 - 即使不符合代码标准)
【讨论】:
Git 具有提交钩子,可让您在提交之前执行命令。不建议使用这些提交挂钩来更改源代码,因为这可能会导致不需要的结果。
但是,您可以使用 git pre-commit 挂钩来执行 PHP 代码嗅探器。 PHP 代码嗅探器是一个工具,可通过 PEAR 安装,它会指出您想知道的不符合标准的地方。您可以设置自己的标准或使用现有标准,如 PEAR 标准。可以设置提交挂钩以显示所有违规(非标准代码)并停止提交。如果代码符合标准,则可以允许提交。
这里是 PHP 代码嗅探器的链接:
http://pear.php.net/package/PHP_CodeSniffer/redirected
这里是 php 代码嗅探器的 git 预提交钩子的一个很好的例子:
https://gist.github.com/1892861
git commit hooks 的一些文档:
【讨论】: