将Git Diff限制为一个或多个函数?

时间:2012-05-07 07:21:18

标签: git git-diff git-log

我在*.py diff=python中设置.git/info/attributes。所以Git知道功能界限在哪里。 git diff -W甚至可以确保显示整个功能。

但有没有办法将git diff的输出限制为特定的函数(或多个函数)?

(没错,我想这很糟糕......)

编辑这对于git loggit rev-list也很有用:不要向我展示修改views.py的每个提交,向我展示修改其中某个函数的提交。 (是的,在一个理想的世界中,views.py不会是由8位不同的开发人员经常修改的2000行庞然大物...)

2 个答案:

答案 0 :(得分:2)

好的,感谢Birei,我们有了解决方案。

在该答案中使用awk脚本,结合一点bash:

~/scripts/grit:

#!/bin/bash
cmd=$1
shift 1
if [ "$cmd" = "" ]; then
  git
# other commands not relevant to this question go here
elif [ $cmd = "funcdiff" ]; then
  git show "$1:$3" | awk -f ~/scripts/getfunc.awk -v f=$4 > /tmp/.tmp1
  git show "$2:$3" | awk -f ~/scripts/getfunc.awk -v f=$4 > /tmp/.tmp2
  git diff -W --no-index /tmp/.tmp1 /tmp/.tmp2 

else
  git $cmd $@
fi

使用示例:grit funcdiff 009e75 8b7a14 ./staging.py write_uploaded

这也可以作为〜/ .gitconfig

中的git别名添加

答案 1 :(得分:1)

我没有找到任何其他选项(已提及的--function-context或其-W短选项除外)能够将diff输出限制为单个函数。

即使-W选项并不总是足够,因此知道“函数”在不同语言之间会有很大差异,如blog post所示:

  

我发现这个选项相当不可靠,至少在一个大的PHP类中是这样   我的测试发现--function-context经常导致显示几乎所有的原始文件,而git似乎对PHP的功能边界一无所知。
  更改之前和之后的上下文行数似乎是随机的,并且diff也不一定总是显示函数的所有行。

     

引入此变化的original patch message揭示了一些亮点:

     
    

此实现与grep中的实现具有相同的缺点,即无法明确查找函数的结尾。
    这意味着会显示几行额外的上下文,直到下一个已识别的函数开始。

  
     

因此,对于git来说,检测函数的界限是很困难的   在这种情况下,git似乎从不检测函数边界并为我们提供整个文件的上下文。


正如OP Steve Bennett指出的那样,一个潜在的解决方案是定义一个git别名,该别名将在修改前后的修订中提取函数,以便在这两个'临时'文件上进行区分。 /> “Creating Git Aliases”和“Bash script to select a single Python function from a file”中的示例。

这是一个临时解决方案,能够解析OP在其回购中使用的特定类型的源。