使用Git识别修订的所有修改功能使用Git识别修订的所有修改功能(Using git to iden

2019-05-12 06:09发布

有没有办法使用git来识别在历史中的每个版本的所有修改过的函数的好办法? 我已经使用-p开关试过了,但它似乎并没有以同样的方式,SVN秀-C函数的参数工作的人。

我的假设是,我需要使用“git的差异HEAD〜我头〜I-1 -p”为我的增加值。 我丢失了一些参数,这将有助于确定对被修改的功能差异的最好的猜测?

Answer 1:

下面是什么我想你会为一个快速和肮脏的尝试。 它做了git log来显示所有版本, -p包括在日志中的差异,一个grep仅包括含有提交ID和大块头的线,并且使用sed过滤掉的行号,只留下了猜想在那混帐的大块头之后写的函数名。

git log -p | grep -E '^(commit|@@)' | sed 's/@@.*@@//'


Answer 2:

这是一个魔法咏唱的内列出函数git diff *

git diff |                  \
grep -E '^(@@)' |           \
grep "(" |                  \
sed 's/@@.*@@//' |          \
sed 's/(.*//' |             \
awk -F " " '{print $NF}' |  \
uniq

...以及它的作用是...

  1. 精选的电流差异,
  2. 未来选秀权只能用“猛男报头”行,
  3. 下纬纱只与开括号线(为可能包含功能名),
  4. 接下来忽略了大块头,
  5. 接下来忽略左括号后的文本,
  6. 未来选秀权只有立即开始括号前的字,
  7. ,最后忽略列表中的同一个词多次出现。

瞧! 你有一个函数列表当前正在修改git diff


*验证使用git version 2.7.4在Ubuntu 16.04运行bash。



Answer 3:

您可以通过使用Git TEXTCONV筛选器列表中的一个版本号的所有修改功能。 我们的想法是创建一个特定的过滤器,列出了所有函数/方法,并为所有的功能,身体的校验和。 这使这种过滤TEXTCONV观点:

m() 12
bar() 42

(这里m()是一个函数签名, 12是其主体的校验和))

git diff上使用两个版本这个过滤器之前和改版后:

  • 如果附加功能,线在DIFF加入

例如:FOO中加入

m() 12
+ foo() 24 
bar() 42
  • 如果一个函数被修改,校验变化,并且线在diff中被更新

例如:foo的主体被修改

m() 12
- foo() 23 
+ foo() 24 
bar() 42

怎么做?

  1. 创建过滤器: java的LS-methods.groovy是使用Groovy并且这样的过滤器的实施方案勺
  2. 注册在git的这个过滤器: git config diff.java-ls-methods.textconv /home/path/to/java-ls-methods.groovy
  3. 关联此过滤器,Java文件: echo "*.java diff=java-ls-methods" >> .gitattributes
  4. 使DIFF: git diff或(对最后提交的差异) git diff master (DIFF对另一个分支)
  5. 一旦你的DIFF完成后,在注释行.gitattributes回到常规差异

积分:解决方案从灵感https://stackoverflow.com/a/16929266



文章来源: Using git to identify all modified functions in a revision