Git 方法级别的差异

Git Diff at method level

我正在查看有关任意两次提交

之间所有methods/function添加、删除和修改的信息

备注-

  1. 代码库位于 Java 和 Github

  2. 最终目标-我必须能够在跨越任何两个提交之间获得所有已删除、已修改(包括源代码修改和方法重命名)和新添加的方法 子包和 classes

  3. 完整的方法签名更开心 与 fully qualified method name

    一起 return

我试过的东西

  1. git Diff - Link - 但 Diff 历史非常长,我真的只对添加、删除或修改的方法的变化感兴趣(即 Java 列出 class 但不是函数)

  2. git log -L :function:path/to/file - 打印该函数的更改历史记录,不做我打算做的事情,观察者在特定函数上而不是整个 git 回购.另一个限制是在两次提交之间获取差异。

期望的结果

任何两个提交之间的差异应该return

Methods Added -> 
        myMethod12 - path/to/class
        myMethod34 - path/to/class

Methods Deleted -> 
        myMethod3 - path/to/class
        myMethod11 - path/to/class

Methods Renamed ->
        (Previous Name)  (Revised Name)  (Path)
        myMethod6        yourMethod32    path/to/class

Methods Modified (source code modifs) ->
        myMethod44 - path/to/class

或者理想情况下完全限定的方法名称

Methods Added ->
       com.example.subp.subp2.nestedpack.addMessages(Message[] msgs)
...

First of all, git works with text and isn't responsible for indexing your sources, searching for methods definitions, etc.

因此,最好的解决方案可能是 diffHere 描述了如何在特定提交之间使用差异。

我个人鼓励您对特定文件使用 diff:git diff specific-file 如果 diff 很大则使用 grep

git diff | grep -e method-name -e public -e private -e void -e etc

希望你能发明出更适合你目标的命令。祝你好运!

Git是通用工具。它不理解您的源语言(在本例中为 Java,但如果您的源语言是 Swift 或 Python 或 C++ 或 TypeScript,或者您能想到的任何其他语言怎么办?)。它只理解 "lines of text" 并具有简单(或有时,不是很简单)的正则表达式来识别函数/方法/class/其他此类定义,以注释差异。1

要获得您想要的输出类型,您需要一个能够理解相关语言的工具。

有这样的工具,你就给它:

  • 旧版本(提交或来自该提交的文件),以及
  • 较新的版本(另一个提交,或来自该提交的 "the same" 文件)。

然后它应该读取这两个提交的文件,弄清楚你有什么方法,并产生你喜欢的任何分析。

此工具需要 Git 的是两个 版本。它何时以及是否可以只处理两个 文件,或需要两个完整的快照,取决于该工具。

git difftool 命令可能对调用此其他工具有帮助,也可能没有帮助。 git difftool 所做的是比较两个完整的提交,然后,对于每个不同的文件,将这些文件的旧版本和新版本提供给另一个工具。您可以从您计算机上任何地方的任何工具中选择第二个工具。 Git 仅在从一对提交中提取的一对文件上调用该工具。如果这满足了您的需要,那么您现在就完成了。如果没有,您可能需要更多步骤:例如,您可能想要 运行 git diff --raw <commit1> <commit2> 并解析其输出,或者只是 git checkout 将两个提交中的每一个都提交到一些临时位置(使用每个临时索引)并从那里开始工作。


1请注意,正则表达式无法正确解析;大多数真实的语言都需要语法。参见,例如 Regular Expression Vs. String Parsing. A proper CS-theoretic discussion will get into Finite State Automata,但在 Whosebug 上通常与主题无关。

我不知道有什么工具可以做到这一点。

为了做类似的事情,你需要一个 Java-aware diff 工具。 difftastic supports Java. You get output like this (diff on some random BSD-3 licensed code):