我在*.py diff=python
中设置.git/info/attributes
。所以Git知道功能界限在哪里。 git diff -W甚至可以确保显示整个功能。
但有没有办法将git diff的输出限制为特定的函数(或多个函数)?
(没错,我想这很糟糕......)
编辑这对于git log
和git rev-list
也很有用:不要向我展示修改views.py的每个提交,向我展示修改其中某个函数的提交。 (是的,在一个理想的世界中,views.py不会是由8位不同的开发人员经常修改的2000行庞然大物...)
答案 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在其回购中使用的特定类型的源。