方法级别的 Git Diff

Posted

技术标签:

【中文标题】方法级别的 Git Diff【英文标题】:Git Diff at method level 【发布时间】:2020-06-16 17:45:25 【问题描述】:

我正在寻找关于任何两次提交之间的所有方法/功能的信息添加、删除和修改

注意事项 -

    代码库位于 Java 和 Github 上

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

    如果完整的方法签名更高兴 与fully qualified method name 一起返回

我尝试过的事情

    git Diff - Link - 但是 Diff 历史很长,我真的只对添加、删除或修改的方法的更改感兴趣(即在 Java 中列出类而不列出函数)

    git log -L :function:path/to/file - 打印该函数的更改历史记录,不执行我打算执行的操作,并且观察者在特定函数上,但不在整个 git repo 上。另一个限制是获得两个提交之间的差异。

期望的结果

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

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)
...

【问题讨论】:

【参考方案1】:

Git 是一个通用工具。它不理解你的源语言(在这种情况下是 Java,但如果你的源语言是 Swift 或 Python 或 C++ 或 TypeScript,或者,好吧,你能想到的任何其他语言呢?)。它只理解“文本行”并具有简单(或有时不是非常简单)的正则表达式来识别函数/方法/类/其他此类定义,注释差异。1

要获得您想要的那种输出,您需要一个确实理解相关语言的工具。

给定这样一个工具,你就给它:

旧版本(提交或来自该提交的文件),以及 较新的版本(另一个提交,或来自该提交的“相同”文件)。

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

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

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


1请注意,正则表达式无法正确解析;大多数真正的语言都需要语法。参见,例如,Regular Expression Vs. String Parsing。适当的 CS 理论讨论将进入 Finite State Automata,但通常不在 *** 上。

【讨论】:

【参考方案2】:

首先,git 处理文本并且不负责索引 您的来源,搜索方法定义等。

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

我想鼓励您对特定文件使用差异:git diff specific-file,如果差异很大,请使用 grep

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

我希望你会为你的目标发明更合适的命令。祝你好运!

【讨论】:

以上是关于方法级别的 Git Diff的主要内容,如果未能解决你的问题,请参考以下文章

git系列1/4git 配置的级别,如何新增删除git配置,配置的覆盖关系配置对应在什么目录

git问题(警告:shell级别(1000)太高,重置为1等..)

Youtrack 与 GIT(不是 github)的集成级别

将 git 存储库向上移动一个层次结构级别

git基础教程 掌握git的基本配置gitconfig

Azure DevOps Server:Git权限设置