有没有一种方法可以让git diff显示方法名称而不是类名?

24

这个问题已经困扰我一段时间了,搜索也没有找到任何线索。

问题:

当我在一个包含Class的PHP文件上执行git diff时,每个差异块描述都只有类名,没有提到方法名。

例如:

@@ -351,7 +351,7 @@ class Session
             $form->setError($field, $subpassValid['msg']);
       }

       // E-Mail address error checking
       $field = "email";  //Use field name for email
-       if(!isset($subemail) || strlen($subemail = trim($subemail)) == 0){
+       if(!$subemail || strlen($subemail = trim($subemail)) == 0){
          $form->setError($field, "* Email not entered");
@@ -373,7 +373,7 @@ class Session
...

问题:

有没有办法告诉git显示方法名称而不是/在类名旁边显示?

编辑:

附加信息:

diff version: 2.8.1
git version: 1.7.6 (from the git-core PPA)
OS: Ubuntu 9.10

我最初使用的是从Ubuntu存储库中获取的Git版本1.7.0.4,但后来更新了它,希望这是个bug。不幸的是,这没有解决问题。

Edit2:

经过更多测试,看起来如果函数声明缩进了(无论是用空格还是制表符),git diff都无法识别函数名。这似乎是git中的一个bug。


1
这里有更多信息:https://dev59.com/U3E85IYBdhLWcg3wbS5h - CodeCaster
1
看起来我们有一个 bug。它应该完全按照你想要的方式工作。 - sanmai
你要显示差异的确切文件名是什么? - hakre
@hakre 我所指的行为在各个方面都是一致的。当我调用 git diff session.php(从中取得示例)或 git diff master 或只是 git diff --staged 时,它就会发生。 - Tarek Fadel
3个回答

23
如果你遇到这个问题,可能是因为 git 允许 diff 定义块标头。如果你想强制使用 git 预定义的 PHP 块标头,请将以下行添加到 Git 存储库根文件夹中的 .gitattributes 或存储库中的 .git/info/attributes 文件中:
*.php diff=php

(其他语言同样支持。内置模式的列表可以在文档中找到。)

全局设置

如果您使用的是 git version >= 1.4,可以通过以下步骤进行全局设置:

  1. 将行放入 ~/.gitattributes 文件中
  2. 运行命令 git config --global core.attributesfile "~/.gitattributes"

或者,您也可以将行放入 /etc/gitattributes 文件中进行全局设置。

警告:如果您个人设置了全局属性,当您的同事运行 git diff 时可能会得到不同的结果,因为他们不会将 .gitattributes 的副本检出到本地仓库中。


8
我不太明白为什么它不能按照应有的方式工作。
作为临时解决方案,请将以下内容添加到.gitattributes中:
*.php   diff=phpf

请将以下内容添加到 .git/config 或者 ~/.gitconfig 文件中:

[diff "phpf"]
        xfuncname = "^[\t ]*(((public|protected|private|static)[\t ]+)*function.*)$"

如果需要永久解决方案,请直接向Git开发人员咨询,发送电子邮件至git@vger.kernel.org邮件列表。


执行上述操作将完全删除该部分。使用上面的示例,“class Session”现在已经消失,被替换为什么都没有。如果有帮助的话,我已经在原问题中添加了版本号。 - Tarek Fadel
3
我认为结尾处的\n破坏了它;它被用来在某种程度上分隔正则表达式,而你这里只有一个。如果不加那个符号,它就能运行。 (不过另一种解决方案更加优雅。) - Tgr

1

如果使用Git 2.19(2018年第三季度)的话,.php的用户差异模式已经得到更新,因此该差异可能会更好。

请参见提交1ab6316提交9992fbd(由Kana Natsuno (kana)于2018年7月3日发布)。
(由Junio C Hamano -- gitster --合并于提交d3f0938,2018年7月24日)

userdiff: 支持 PHP hunk header 中的新关键字

PHP 的最近版本支持interfacetraitabstract classfinal class
此补丁修复了 PHP hunk header 正则表达式,以支持所有这些关键字。


随着Git 2.30(2021年第一季度)的推出,它确实有所改进:

请参见提交 aff9282(由Javier Spagnoletti (phansys)于2020年10月7日完成)。
(由Junio C Hamano -- gitster --合并于提交 a8a49eb,2020年10月27日)

userdiff:PHP:捕获“abstract”和“final”函数

协助者:Johannes Sixt
签署者:Javier Spagnoletti

PHP permits functions to be defined like

final public function foo() { }
abstract protected function bar() { }  

but our hunk header pattern does not recognize these decorations.

Add "final" and "abstract" to the list of function modifiers.


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