有没有一种好的方法使用git来识别历史中每个版本中所有修改过的函数?我尝试使用-p开关,但它似乎不能像svn的show-c-function参数那样工作。
我的假设是,我将想要使用“git diff HEAD~i HEAD~i-1 -p”来增加i的值。我是否错过了一些参数,可以帮助确定diff对哪些函数进行了修改的最佳猜测?
我的假设是,我将想要使用“git diff HEAD~i HEAD~i-1 -p”来增加i的值。我是否错过了一些参数,可以帮助确定diff对哪些函数进行了修改的最佳猜测?
这是一个神奇的咒语,用于列出在 git diff
* 中的函数。
git diff | \
grep -E '^(@@)' | \
grep "(" | \
sed 's/@@.*@@//' | \
sed 's/(.*//' | \
awk -F " " '{print $NF}' | \
uniq
...它所做的是...
- 选择当前的差异(diff),
- 接下来只选择带有"hunk-headers"的行,
- 接下来只选择包含函数名可能性的开括号中的行,
- 接下来忽略hunk headers,
- 接下来忽略开括号后的文本,
- 接下来只选择开括号前面的单词,
- 最后在列表中忽略相同单词的多次出现。
Voila! 现在你有了一个被当前git diff
修改的函数列表。
* 在运行bash的Ubuntu 16.04上使用git version 2.7.4
进行验证。
.gitattributes
文件,指定每个文件的语言,以便diff找到正确的头文件。创建该文件的说明:https://dev59.com/G2s05IYBdhLWcg3wQvyq#7347993 - Loren这是我尝试翻译的内容,它会执行git log
来显示所有版本,-p
用于在日志中包含差异,使用grep
仅包括包含提交ID和块标题的行,并使用sed
过滤掉行号,只留下Git在块标题后写的函数名称猜测。
git log -p | grep -E '^(commit|@@)' | sed 's/@@.*@@//'
您可以使用git文本转换过滤器列出修订版本中所有修改的函数。其思想是创建一个特定的过滤器,列出所有函数/方法,并为所有函数计算主体的校验和。这将提供这种类型的过滤器文本转换视图:
m() 12
bar() 42
(这里m()
是函数签名,12
是其主体的校验和)
当git diff
在修订前后的两个版本上使用此过滤器时:
例如:添加了foo
m() 12
+ foo() 24
bar() 42
例如:修改了foo的主体
m() 12
- foo() 23
+ foo() 24
bar() 42
如何做到这一点?
git config diff.java-ls-methods.textconv /home/path/to/java-ls-methods.groovy
echo "*.java diff=java-ls-methods" >> .gitattributes
git diff
(与上次提交进行比较)或 git diff master
(与另一个分支进行比较).gitattributes
中注释该行以返回正常差异致谢:解决方案灵感来自 https://dev59.com/YG445IYBdhLWcg3wmLdd#16929266